diff options
author | Duarte Meneses <duarte.meneses@sonarsource.com> | 2019-10-23 15:33:39 -0500 |
---|---|---|
committer | SonarTech <sonartech@sonarsource.com> | 2020-01-31 20:46:09 +0100 |
commit | ace9a50d55d831ec71b7db421aa04d1198392c6c (patch) | |
tree | 3bf598bfe3f760d45310b2a65d014a53370a9930 /server | |
parent | 1ff9a01fd6e822793ef223f9ce259b15d17eecc4 (diff) | |
download | sonarqube-ace9a50d55d831ec71b7db421aa04d1198392c6c.tar.gz sonarqube-ace9a50d55d831ec71b7db421aa04d1198392c6c.zip |
SONAR-12689 Separate storage of projects/apps from their components and branches
Diffstat (limited to 'server')
306 files changed, 4307 insertions, 2577 deletions
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ProjectPersister.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ProjectPersister.java new file mode 100644 index 00000000000..645ca0ddb73 --- /dev/null +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/component/ProjectPersister.java @@ -0,0 +1,74 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.ce.task.projectanalysis.component; + +import org.apache.commons.lang.StringUtils; +import org.sonar.api.utils.System2; +import org.sonar.db.DbClient; +import org.sonar.db.DbSession; +import org.sonar.db.project.ProjectDto; + +/** + * Creates or updates the data in table {@code PROJECTS} for the current root. + */ +public class ProjectPersister { + private final DbClient dbClient; + private final TreeRootHolder treeRootHolder; + private final System2 system2; + + public ProjectPersister(DbClient dbClient, TreeRootHolder treeRootHolder, System2 system2) { + this.dbClient = dbClient; + this.treeRootHolder = treeRootHolder; + this.system2 = system2; + } + + public void persist(DbSession dbSession) { + if (shouldSkip(treeRootHolder.getRoot())) { + return; + } + + ProjectDto dbProjectDto = dbClient.projectDao().selectProjectByKey(dbSession, treeRootHolder.getRoot().getKey()) + .orElseThrow(() -> new IllegalStateException("Project has been deleted by end-user during analysis")); + ProjectDto projectDto = toProjectDto(treeRootHolder.getRoot()); + + if (hasChanged(dbProjectDto, projectDto)) { + // insert or update in projects table + dbClient.projectDao().update(dbSession, projectDto); + } + } + + private boolean shouldSkip(Component rootComponent) { + return !rootComponent.getType().equals(Component.Type.PROJECT) && !rootComponent.getType().equals(Component.Type.PROJECT_VIEW); + } + + private boolean hasChanged(ProjectDto dbProject, ProjectDto newProject) { + return !StringUtils.equals(dbProject.getName(), newProject.getName()) || + !StringUtils.equals(dbProject.getDescription(), newProject.getDescription()); + } + + private ProjectDto toProjectDto(Component root) { + ProjectDto projectDto = new ProjectDto(); + projectDto.setUuid(root.getUuid()); + projectDto.setName(root.getName()); + projectDto.setDescription(root.getDescription()); + projectDto.setUpdatedAt(system2.now()); + return projectDto; + } +} diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java index 6a5e0d89229..c9107ed7d00 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java @@ -34,6 +34,7 @@ import org.sonar.ce.task.projectanalysis.component.BranchPersisterImpl; import org.sonar.ce.task.projectanalysis.component.ConfigurationRepositoryImpl; import org.sonar.ce.task.projectanalysis.component.DbIdsRepositoryImpl; import org.sonar.ce.task.projectanalysis.component.DisabledComponentsHolderImpl; +import org.sonar.ce.task.projectanalysis.component.ProjectPersister; import org.sonar.ce.task.projectanalysis.component.ReferenceBranchComponentUuids; import org.sonar.ce.task.projectanalysis.component.ReportModulesPath; import org.sonar.ce.task.projectanalysis.component.SiblingComponentsWithOpenIssues; @@ -284,6 +285,7 @@ public final class ProjectAnalysisTaskContainerPopulator implements ContainerPop BaseIssuesLoader.class, IssueTrackingDelegator.class, BranchPersisterImpl.class, + ProjectPersister.class, SiblingsIssuesLoader.class, SiblingsIssueMerger.class, NewCodePeriodResolver.class, diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStep.java index f53c5ad1ca0..2ed3f307a52 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStep.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStep.java @@ -44,6 +44,7 @@ import org.sonar.ce.task.projectanalysis.component.MutableDisabledComponentsHold import org.sonar.ce.task.projectanalysis.component.PathAwareCrawler; import org.sonar.ce.task.projectanalysis.component.PathAwareVisitor; import org.sonar.ce.task.projectanalysis.component.PathAwareVisitorAdapter; +import org.sonar.ce.task.projectanalysis.component.ProjectPersister; import org.sonar.ce.task.projectanalysis.component.TreeRootHolder; import org.sonar.ce.task.step.ComputationStep; import org.sonar.core.util.stream.MoreCollectors; @@ -71,11 +72,12 @@ public class PersistComponentsStep implements ComputationStep { private final MutableDisabledComponentsHolder disabledComponentsHolder; private final AnalysisMetadataHolder analysisMetadataHolder; private final BranchPersister branchPersister; + private final ProjectPersister projectPersister; public PersistComponentsStep(DbClient dbClient, TreeRootHolder treeRootHolder, MutableDbIdsRepository dbIdsRepository, System2 system2, MutableDisabledComponentsHolder disabledComponentsHolder, AnalysisMetadataHolder analysisMetadataHolder, - BranchPersister branchPersister) { + BranchPersister branchPersister, ProjectPersister projectPersister) { this.dbClient = dbClient; this.treeRootHolder = treeRootHolder; this.dbIdsRepository = dbIdsRepository; @@ -83,6 +85,7 @@ public class PersistComponentsStep implements ComputationStep { this.disabledComponentsHolder = disabledComponentsHolder; this.analysisMetadataHolder = analysisMetadataHolder; this.branchPersister = branchPersister; + this.projectPersister = projectPersister; } @Override @@ -94,6 +97,7 @@ public class PersistComponentsStep implements ComputationStep { public void execute(ComputationStep.Context context) { try (DbSession dbSession = dbClient.openSession(false)) { branchPersister.persist(dbSession); + projectPersister.persist(dbSession); String projectUuid = treeRootHolder.getRoot().getUuid(); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/BranchPersisterImplTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/BranchPersisterImplTest.java index 730f0324343..4359d0d8950 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/BranchPersisterImplTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/BranchPersisterImplTest.java @@ -105,7 +105,7 @@ public class BranchPersisterImplTest { // add project and branch in table PROJECTS ComponentDto mainComponent = ComponentTesting.newPrivateProjectDto(dbTester.organizations().insert(), MAIN.getUuid()).setDbKey(MAIN.getKey()); - ComponentDto component = ComponentTesting.newProjectBranch(mainComponent, new BranchDto().setUuid(BRANCH1.getUuid()).setKey(BRANCH1.getKey()).setBranchType(BRANCH)); + ComponentDto component = ComponentTesting.newBranchComponent(mainComponent, new BranchDto().setUuid(BRANCH1.getUuid()).setKey(BRANCH1.getKey()).setBranchType(BRANCH)); dbTester.getDbClient().componentDao().insert(dbTester.getSession(), mainComponent, component); dbTester.commit(); // set project in metadata @@ -117,7 +117,7 @@ public class BranchPersisterImplTest { dbTester.getSession().commit(); - assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(2); + assertThat(dbTester.countRowsOfTable("components")).isEqualTo(2); Optional<BranchDto> branchDto = dbTester.getDbClient().branchDao().selectByUuid(dbTester.getSession(), BRANCH1.getUuid()); assertThat(branchDto).isPresent(); assertThat(branchDto.get().getBranchType()).isEqualTo(BRANCH); @@ -131,7 +131,7 @@ public class BranchPersisterImplTest { public void main_branch_is_excluded_from_branch_purge_by_default() { analysisMetadataHolder.setBranch(createBranch(BRANCH, true, "master")); treeRootHolder.setRoot(MAIN); - dbTester.components().insertMainBranch(p -> p.setDbKey(MAIN.getDbKey()).setUuid(MAIN.getUuid())); + dbTester.components().insertPublicProject(p -> p.setDbKey(MAIN.getDbKey()).setUuid(MAIN.getUuid())); dbTester.commit(); underTest.persist(dbTester.getSession()); @@ -146,8 +146,8 @@ public class BranchPersisterImplTest { analysisMetadataHolder.setBranch(createBranch(BRANCH, false, "BRANCH_KEY")); treeRootHolder.setRoot(BRANCH1); - ComponentDto mainComponent = dbTester.components().insertMainBranch(p -> p.setDbKey(MAIN.getDbKey()).setUuid(MAIN.getUuid())); - ComponentDto component = ComponentTesting.newProjectBranch(mainComponent, new BranchDto().setUuid(BRANCH1.getUuid()).setKey(BRANCH1.getKey()).setBranchType(BRANCH)); + ComponentDto mainComponent = dbTester.components().insertPublicProject(p -> p.setDbKey(MAIN.getDbKey()).setUuid(MAIN.getUuid())); + ComponentDto component = ComponentTesting.newBranchComponent(mainComponent, new BranchDto().setUuid(BRANCH1.getUuid()).setKey(BRANCH1.getKey()).setBranchType(BRANCH)); dbTester.getDbClient().componentDao().insert(dbTester.getSession(), component); dbTester.commit(); @@ -163,8 +163,8 @@ public class BranchPersisterImplTest { analysisMetadataHolder.setBranch(createBranch(BRANCH, false, "BRANCH_KEY")); treeRootHolder.setRoot(BRANCH1); - ComponentDto mainComponent = dbTester.components().insertMainBranch(p -> p.setDbKey(MAIN.getDbKey()).setUuid(MAIN.getUuid())); - ComponentDto component = ComponentTesting.newProjectBranch(mainComponent, new BranchDto().setUuid(BRANCH1.getUuid()).setKey(BRANCH1.getKey()).setBranchType(BRANCH)); + ComponentDto mainComponent = dbTester.components().insertPublicProject(p -> p.setDbKey(MAIN.getDbKey()).setUuid(MAIN.getUuid())); + ComponentDto component = ComponentTesting.newBranchComponent(mainComponent, new BranchDto().setUuid(BRANCH1.getUuid()).setKey(BRANCH1.getKey()).setBranchType(BRANCH)); dbTester.getDbClient().componentDao().insert(dbTester.getSession(), component); dbTester.commit(); @@ -188,7 +188,7 @@ public class BranchPersisterImplTest { // add project and branch in table PROJECTS ComponentDto mainComponent = ComponentTesting.newPrivateProjectDto(dbTester.organizations().insert(), MAIN.getUuid()).setDbKey(MAIN.getKey()); - ComponentDto component = ComponentTesting.newProjectBranch(mainComponent, new BranchDto().setUuid(BRANCH1.getUuid()).setKey(BRANCH1.getKey()).setBranchType(PULL_REQUEST)); + ComponentDto component = ComponentTesting.newBranchComponent(mainComponent, new BranchDto().setUuid(BRANCH1.getUuid()).setKey(BRANCH1.getKey()).setBranchType(PULL_REQUEST)); dbTester.getDbClient().componentDao().insert(dbTester.getSession(), mainComponent, component); dbTester.commit(); // set project in metadata @@ -201,7 +201,7 @@ public class BranchPersisterImplTest { dbTester.getSession().commit(); - assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(2); + assertThat(dbTester.countRowsOfTable("components")).isEqualTo(2); Optional<BranchDto> branchDto = dbTester.getDbClient().branchDao().selectByUuid(dbTester.getSession(), BRANCH1.getUuid()); assertThat(branchDto).isPresent(); assertThat(branchDto.get().getBranchType()).isEqualTo(PULL_REQUEST); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ConfigurationRepositoryTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ConfigurationRepositoryTest.java index b40925e9e88..6c8b5144e8c 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ConfigurationRepositoryTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ConfigurationRepositoryTest.java @@ -121,7 +121,7 @@ public class ConfigurationRepositoryTest { @Test public void branch_settings() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branchDto = db.components().insertProjectBranch(project); Branch branch = mock(Branch.class); when(branch.getName()).thenReturn(branchDto.getBranch()); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ProjectPersisterTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ProjectPersisterTest.java new file mode 100644 index 00000000000..af89af4648a --- /dev/null +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ProjectPersisterTest.java @@ -0,0 +1,115 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.ce.task.projectanalysis.component; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.api.impl.utils.TestSystem2; +import org.sonar.api.utils.System2; +import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule; +import org.sonar.db.DbTester; +import org.sonar.db.project.ProjectDto; + +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.verifyNoInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; +import static org.sonar.ce.task.projectanalysis.component.Component.Type.PROJECT; +import static org.sonar.ce.task.projectanalysis.component.Component.Type.VIEW; +import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder; + +public class ProjectPersisterTest { + private final static Component ROOT = builder(PROJECT, 1) + .setUuid("PROJECT_UUID") + .setKey("PROJECT_KEY") + .setDescription("PROJECT_DESC") + .setName("PROJECT_NAME") + .build(); + + @Rule + public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule(); + @Rule + public DbTester dbTester = DbTester.create(System2.INSTANCE); + @Rule + public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); + @Rule + public ExpectedException exception = ExpectedException.none(); + public TestSystem2 system2 = new TestSystem2(); + + private ProjectPersister underTest = new ProjectPersister(dbTester.getDbClient(), treeRootHolder, system2); + + @Before + public void prepare() { + treeRootHolder.setRoot(ROOT); + system2.setNow(1000L); + } + + @Test + public void skip_portfolios() { + Component root = ViewsComponent.builder(VIEW, 1).build(); + TreeRootHolder treeRootHolder = mock(TreeRootHolder.class); + when(treeRootHolder.getRoot()).thenReturn(root); + new ProjectPersister(dbTester.getDbClient(), treeRootHolder, system2).persist(dbTester.getSession()); + verify(treeRootHolder).getRoot(); + verifyNoMoreInteractions(treeRootHolder); + + } + + @Test + public void update_description() { + ProjectDto p1 = dbTester.components().insertPublicProjectDto(dbTester.getDefaultOrganization(), + c -> c.setUuid("PROJECT_UUID").setDbKey(ROOT.getKey()).setName(ROOT.getName()).setDescription("OLD_DESC")); + + assertProject("OLD_DESC", ROOT.getName(), p1.getUpdatedAt()); + underTest.persist(dbTester.getSession()); + assertProject(ROOT.getDescription(), ROOT.getName(), 1000L); + } + + @Test + public void update_name() { + ProjectDto p1 = dbTester.components().insertPublicProjectDto(dbTester.getDefaultOrganization(), + c -> c.setUuid("PROJECT_UUID").setDbKey(ROOT.getKey()).setName("OLD_NAME").setDescription(ROOT.getDescription())); + + assertProject(ROOT.getDescription(), "OLD_NAME", p1.getUpdatedAt()); + underTest.persist(dbTester.getSession()); + assertProject(ROOT.getDescription(), ROOT.getName(), 1000L); + } + + @Test + public void dont_update() { + ProjectDto p1 = dbTester.components().insertPublicProjectDto(dbTester.getDefaultOrganization(), + c -> c.setUuid("PROJECT_UUID").setDbKey(ROOT.getKey()).setName(ROOT.getName()).setDescription(ROOT.getDescription())); + + assertProject(ROOT.getDescription(), ROOT.getName(), p1.getUpdatedAt()); + underTest.persist(dbTester.getSession()); + assertProject(ROOT.getDescription(), ROOT.getName(), p1.getUpdatedAt()); + } + + private void assertProject(String description, String name, long updated) { + assertThat(dbTester.getDbClient().projectDao().selectProjectByKey(dbTester.getSession(), ROOT.getKey()).get()) + .extracting(ProjectDto::getName, ProjectDto::getDescription, ProjectDto::getUpdatedAt) + .containsExactly(name, description, updated); + + } +} diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ReferenceBranchComponentUuidsTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ReferenceBranchComponentUuidsTest.java index 7f04822a3d2..dd4b8d83478 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ReferenceBranchComponentUuidsTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/ReferenceBranchComponentUuidsTest.java @@ -62,7 +62,7 @@ public class ReferenceBranchComponentUuidsTest { analysisMetadataHolder.setProject(project); analysisMetadataHolder.setBranch(branch); - ComponentDto projectDto = db.components().insertMainBranch(); + ComponentDto projectDto = db.components().insertPublicProject(); when(project.getUuid()).thenReturn(projectDto.uuid()); branch1 = db.components().insertProjectBranch(projectDto, b -> b.setKey("branch1")); branch2 = db.components().insertProjectBranch(projectDto, b -> b.setKey("branch2")); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/SiblingComponentsWithOpenIssuesTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/SiblingComponentsWithOpenIssuesTest.java index 6079985d17a..bce2e086cd8 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/SiblingComponentsWithOpenIssuesTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/component/SiblingComponentsWithOpenIssuesTest.java @@ -63,7 +63,7 @@ public class SiblingComponentsWithOpenIssuesTest { @Before public void setUp() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); branch1 = db.components().insertProjectBranch(project, b -> b.setKey("branch1"), b -> b.setBranchType(BranchType.BRANCH)); branch1pr1 = db.components().insertProjectBranch(project, @@ -157,7 +157,7 @@ public class SiblingComponentsWithOpenIssuesTest { @Test public void should_find_sibling_components_with_open_issues_from_pullrequest() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); setRoot(project); setBranch(BranchType.BRANCH); @@ -176,7 +176,7 @@ public class SiblingComponentsWithOpenIssuesTest { @Test public void should_not_find_sibling_components_on_derived_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); setRoot(project); setBranch(BranchType.BRANCH); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ProjectTrackerBaseLazyInputTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ProjectTrackerBaseLazyInputTest.java index f6f23259141..740c4f0f592 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ProjectTrackerBaseLazyInputTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ProjectTrackerBaseLazyInputTest.java @@ -74,7 +74,7 @@ public class ProjectTrackerBaseLazyInputTest { public void prepare() { rule = dbTester.rules().insert(); ruleRepositoryRule.add(rule.getKey()); - rootProjectDto = dbTester.components().insertMainBranch(); + rootProjectDto = dbTester.components().insertPublicProject(); ReportComponent rootProject = ReportComponent.builder(Component.Type.FILE, 1) .setKey(rootProjectDto.getDbKey()) .setUuid(rootProjectDto.uuid()).build(); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/SiblingsIssueMergerTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/SiblingsIssueMergerTest.java index 3d0ac23eda5..5df924d9aa7 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/SiblingsIssueMergerTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/SiblingsIssueMergerTest.java @@ -109,7 +109,7 @@ public class SiblingsIssueMergerTest { copier = new SiblingsIssueMerger(new SiblingsIssuesLoader(new SiblingComponentsWithOpenIssues(treeRootHolder, metadataHolder, dbClient), dbClient, componentIssuesLoader), tracker, issueLifecycle); - projectDto = db.components().insertMainBranch(p -> p.setDbKey(PROJECT_KEY).setUuid(PROJECT_UUID)); + projectDto = db.components().insertPublicProject(p -> p.setDbKey(PROJECT_KEY).setUuid(PROJECT_UUID)); branch1Dto = db.components().insertProjectBranch(projectDto, b -> b.setKey("myBranch1") .setBranchType(BranchType.PULL_REQUEST) .setMergeBranchUuid(projectDto.uuid())); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java index 148aaa2f448..3c5307a120a 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/BuildComponentTreeStepTest.java @@ -196,7 +196,7 @@ public class BuildComponentTreeStepTest { @Test public void generate_keys_when_using_existing_branch() { - ComponentDto projectDto = dbTester.components().insertMainBranch(); + ComponentDto projectDto = dbTester.components().insertPublicProject(); ComponentDto branchDto = dbTester.components().insertProjectBranch(projectDto); Branch branch = mock(Branch.class); when(branch.getName()).thenReturn(branchDto.getBranch()); 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 104674857b0..b58ffb3c481 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 @@ -103,7 +103,7 @@ public class LoadPeriodsStepTest extends BaseStepTest { @Before public void setUp() { organization = dbTester.organizations().insert(); - project = dbTester.components().insertMainBranch(organization); + project = dbTester.components().insertPublicProject(organization); when(analysisMetadataHolder.isBranch()).thenReturn(true); when(analysisMetadataHolder.isFirstAnalysis()).thenReturn(false); @@ -241,7 +241,7 @@ public class LoadPeriodsStepTest extends BaseStepTest { @Test public void throw_ISE_when_specific_analysis_is_set_but_does_not_exist_in_DB() { OrganizationDto organization = dbTester.organizations().insert(); - ComponentDto project = dbTester.components().insertMainBranch(organization); + ComponentDto project = dbTester.components().insertPublicProject(organization); setProjectPeriod(project.uuid(), NewCodePeriodType.SPECIFIC_ANALYSIS, "nonexistent"); setupRoot(project); @@ -253,7 +253,7 @@ public class LoadPeriodsStepTest extends BaseStepTest { @Test public void throw_ISE_when_specific_analysis_is_set_but_does_not_belong_to_current_project() { - ComponentDto otherProject = dbTester.components().insertMainBranch(organization); + ComponentDto otherProject = dbTester.components().insertPublicProject(organization); SnapshotDto otherProjectAnalysis = dbTester.components().insertSnapshot(otherProject); setBranchPeriod(project.uuid(), project.uuid(), NewCodePeriodType.SPECIFIC_ANALYSIS, otherProjectAnalysis.getUuid()); setupRoot(project); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStepTest.java index 905d47fb769..d4da264cdc2 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/PersistComponentsStepTest.java @@ -28,6 +28,7 @@ import org.sonar.ce.task.projectanalysis.component.BranchPersister; import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.MutableDbIdsRepository; import org.sonar.ce.task.projectanalysis.component.MutableDisabledComponentsHolder; +import org.sonar.ce.task.projectanalysis.component.ProjectPersister; import org.sonar.ce.task.projectanalysis.component.TreeRootHolder; import org.sonar.ce.task.step.TestComputationStepContext; import org.sonar.db.DbClient; @@ -69,6 +70,7 @@ public class PersistComponentsStepTest { System2.INSTANCE, mock(MutableDisabledComponentsHolder.class), mock(AnalysisMetadataHolder.class), - mock(BranchPersister.class)).execute(new TestComputationStepContext()); + mock(BranchPersister.class), + mock(ProjectPersister.class)).execute(new TestComputationStepContext()); } } diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportPersistComponentsStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportPersistComponentsStepTest.java index e666a663eae..71f2cbcf44a 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportPersistComponentsStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ReportPersistComponentsStepTest.java @@ -38,6 +38,7 @@ import org.sonar.ce.task.projectanalysis.component.DefaultBranchImpl; import org.sonar.ce.task.projectanalysis.component.FileAttributes; import org.sonar.ce.task.projectanalysis.component.MutableDbIdsRepositoryRule; import org.sonar.ce.task.projectanalysis.component.MutableDisabledComponentsHolder; +import org.sonar.ce.task.projectanalysis.component.ProjectPersister; import org.sonar.ce.task.projectanalysis.component.ReportComponent; import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule; import org.sonar.ce.task.step.ComputationStep; @@ -95,7 +96,8 @@ public class ReportPersistComponentsStepTest extends BaseStepTest { db.organizations().insertForUuid(ORGANIZATION_UUID); BranchPersister branchPersister = mock(BranchPersister.class); - underTest = new PersistComponentsStep(dbClient, treeRootHolder, dbIdsRepository, system2, disabledComponentsHolder, analysisMetadataHolder, branchPersister); + ProjectPersister projectPersister = mock(ProjectPersister.class); + underTest = new PersistComponentsStep(dbClient, treeRootHolder, dbIdsRepository, system2, disabledComponentsHolder, analysisMetadataHolder, branchPersister, projectPersister); } @Override @@ -123,7 +125,7 @@ public class ReportPersistComponentsStepTest extends BaseStepTest { underTest.execute(new TestComputationStepContext()); - assertThat(db.countRowsOfTable("projects")).isEqualTo(3); + assertThat(db.countRowsOfTable("components")).isEqualTo(3); ComponentDto directoryDto = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get(); assertThat(directoryDto.getOrganizationUuid()).isEqualTo(ORGANIZATION_UUID); @@ -185,7 +187,7 @@ public class ReportPersistComponentsStepTest extends BaseStepTest { underTest.execute(new TestComputationStepContext()); - assertThat(db.countRowsOfTable("projects")).isEqualTo(3); + assertThat(db.countRowsOfTable("components")).isEqualTo(3); ComponentDto directoryDto = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get(); assertThat(directoryDto.getOrganizationUuid()).isEqualTo(ORGANIZATION_UUID); @@ -365,7 +367,7 @@ public class ReportPersistComponentsStepTest extends BaseStepTest { underTest.execute(new TestComputationStepContext()); - assertThat(db.countRowsOfTable("projects")).isEqualTo(3); + assertThat(db.countRowsOfTable("components")).isEqualTo(3); ComponentDto projectReloaded = dbClient.componentDao().selectByKey(db.getSession(), project.getDbKey()).get(); assertThat(projectReloaded.getId()).isEqualTo(project.getId()); @@ -414,7 +416,7 @@ public class ReportPersistComponentsStepTest extends BaseStepTest { underTest.execute(new TestComputationStepContext()); - assertThat(db.countRowsOfTable("projects")).isEqualTo(3); + assertThat(db.countRowsOfTable("components")).isEqualTo(3); assertThat(dbClient.componentDao().selectByKey(db.getSession(), project.getDbKey()).get().getId()).isEqualTo(project.getId()); assertThat(dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get().getId()).isEqualTo(directory.getId()); assertThat(dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir/Foo.java").get().getId()).isEqualTo(file.getId()); @@ -476,7 +478,7 @@ public class ReportPersistComponentsStepTest extends BaseStepTest { dbClient.componentDao().applyBChangesForRootComponentUuid(db.getSession(), project.uuid()); db.commit(); - assertThat(db.countRowsOfTable("projects")).isEqualTo(3); + assertThat(db.countRowsOfTable("components")).isEqualTo(3); ComponentDto directoryReloaded = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get(); assertThat(directoryReloaded).isNotNull(); @@ -548,7 +550,7 @@ public class ReportPersistComponentsStepTest extends BaseStepTest { underTest.execute(new TestComputationStepContext()); - assertThat(db.countRowsOfTable("projects")).isEqualTo(3); + assertThat(db.countRowsOfTable("components")).isEqualTo(3); assertThat(dbClient.componentDao().selectByKey(db.getSession(), project.getDbKey()).get().getId()).isEqualTo(project.getId()); assertThat(dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get().getId()).isEqualTo(removedDirectory.getId()); assertThat(dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir/Foo.java").get().getId()).isEqualTo(removedFile.getId()); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStepTest.java index 2c34348cc4f..11be48ed072 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStepTest.java @@ -101,7 +101,7 @@ import static org.sonar.db.component.BranchType.PULL_REQUEST; import static org.sonar.db.component.ComponentTesting.newBranchDto; import static org.sonar.db.component.ComponentTesting.newFileDto; import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto; -import static org.sonar.db.component.ComponentTesting.newProjectBranch; +import static org.sonar.db.component.ComponentTesting.newBranchComponent; import static org.sonar.db.issue.IssueTesting.newIssue; import static org.sonar.db.organization.OrganizationTesting.newOrganizationDto; import static org.sonar.db.rule.RuleTesting.newRule; @@ -560,7 +560,7 @@ public class SendIssueNotificationsStepTest extends BaseStepTest { private void sendIssueChangeNotificationOnBranch(long issueCreatedAt) { ComponentDto project = newPrivateProjectDto(newOrganizationDto()); - ComponentDto branch = newProjectBranch(project, newBranchDto(project).setKey(BRANCH_NAME)); + ComponentDto branch = newBranchComponent(project, newBranchDto(project).setKey(BRANCH_NAME)); ComponentDto file = newFileDto(branch); treeRootHolder.setRoot(builder(Type.PROJECT, 2).setKey(branch.getDbKey()).setPublicKey(branch.getKey()).setName(branch.longName()).setUuid(branch.uuid()).addChildren( builder(Type.FILE, 11).setKey(file.getDbKey()).setPublicKey(file.getKey()).setName(file.longName()).build()).build()); @@ -692,7 +692,7 @@ public class SendIssueNotificationsStepTest extends BaseStepTest { } private ComponentDto setUpBranch(ComponentDto project, BranchType branchType) { - ComponentDto branch = newProjectBranch(project, newBranchDto(project, branchType).setKey(BRANCH_NAME)); + ComponentDto branch = newBranchComponent(project, newBranchDto(project, branchType).setKey(BRANCH_NAME)); ComponentDto file = newFileDto(branch); treeRootHolder.setRoot(builder(Type.PROJECT, 2).setKey(branch.getDbKey()).setPublicKey(branch.getKey()).setName(branch.longName()).setUuid(branch.uuid()).addChildren( builder(Type.FILE, 11).setKey(file.getDbKey()).setPublicKey(file.getKey()).setName(file.longName()).build()).build()); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ValidateProjectStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ValidateProjectStepTest.java index f6ede0e98a1..42a52d6d3a5 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ValidateProjectStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ValidateProjectStepTest.java @@ -69,7 +69,7 @@ public class ValidateProjectStepTest { @Test public void fail_if_pr_is_targeting_branch_with_modules() { - ComponentDto masterProject = dbTester.components().insertMainBranch(); + ComponentDto masterProject = dbTester.components().insertPublicProject(); ComponentDto mergeBranch = dbTester.components().insertProjectBranch(masterProject, b -> b.setKey("mergeBranch")); dbClient.componentDao().insert(dbTester.getSession(), ComponentTesting.newModuleDto(mergeBranch)); setBranch(BranchType.PULL_REQUEST, mergeBranch.uuid()); @@ -86,7 +86,7 @@ public class ValidateProjectStepTest { @Test public void dont_fail_for_long_forked_from_master_with_modules() { - ComponentDto masterProject = dbTester.components().insertMainBranch(); + ComponentDto masterProject = dbTester.components().insertPublicProject(); dbClient.componentDao().insert(dbTester.getSession(), ComponentTesting.newModuleDto(masterProject)); setBranch(BranchType.BRANCH, masterProject.uuid()); dbTester.getSession().commit(); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ViewsPersistComponentsStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ViewsPersistComponentsStepTest.java index 11e583ccc27..fe5c7f40f8e 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ViewsPersistComponentsStepTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/ViewsPersistComponentsStepTest.java @@ -36,6 +36,7 @@ import org.sonar.ce.task.projectanalysis.component.Component; import org.sonar.ce.task.projectanalysis.component.DefaultBranchImpl; import org.sonar.ce.task.projectanalysis.component.MutableDbIdsRepositoryRule; import org.sonar.ce.task.projectanalysis.component.MutableDisabledComponentsHolder; +import org.sonar.ce.task.projectanalysis.component.ProjectPersister; import org.sonar.ce.task.projectanalysis.component.ProjectViewAttributes; import org.sonar.ce.task.projectanalysis.component.SubViewAttributes; import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule; @@ -104,7 +105,8 @@ public class ViewsPersistComponentsStepTest extends BaseStepTest { dbTester.organizations().insertForUuid(ORGANIZATION_UUID); analysisMetadataHolder.setBranch(new DefaultBranchImpl()); BranchPersister branchPersister = mock(BranchPersister.class); - underTest = new PersistComponentsStep(dbClient, treeRootHolder, dbIdsRepository, system2, disabledComponentsHolder, analysisMetadataHolder, branchPersister); + ProjectPersister projectPersister = mock(ProjectPersister.class); + underTest = new PersistComponentsStep(dbClient, treeRootHolder, dbIdsRepository, system2, disabledComponentsHolder, analysisMetadataHolder, branchPersister, projectPersister); } @Override @@ -482,7 +484,7 @@ public class ViewsPersistComponentsStepTest extends BaseStepTest { } private void assertRowsCountInTableProjects(int rowCount) { - assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(rowCount); + assertThat(dbTester.countRowsOfTable("components")).isEqualTo(rowCount); } private void assertDtoNotUpdated(String componentKey) { diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java b/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java index b99e0c4b47d..4a62219ab11 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java @@ -128,7 +128,7 @@ public class ComputeEngineContainerImplTest { assertThat(picoContainer.getParent().getParent().getParent().getComponentAdapters()).hasSize( COMPONENTS_IN_LEVEL_1_AT_CONSTRUCTION + 27 // level 1 - + 65 // content of DaoModule + + 66 // content of DaoModule + 3 // content of EsModule + 50 // content of CorePropertyDefinitions + 1 // StopFlagContainer diff --git a/server/sonar-db-core/src/main/java/org/sonar/db/version/SqTables.java b/server/sonar-db-core/src/main/java/org/sonar/db/version/SqTables.java index d401aa0ec46..1cc30304e5d 100644 --- a/server/sonar-db-core/src/main/java/org/sonar/db/version/SqTables.java +++ b/server/sonar-db-core/src/main/java/org/sonar/db/version/SqTables.java @@ -61,6 +61,7 @@ public final class SqTables { "ce_task_input", "ce_task_message", "ce_scanner_context", + "components", "default_qprofiles", "deprecated_rule_keys", "duplications_index", diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java b/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java index 34f8d4e0d37..9cf5de73ba4 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java @@ -61,6 +61,7 @@ import org.sonar.db.permission.UserPermissionDao; import org.sonar.db.permission.template.PermissionTemplateCharacteristicDao; import org.sonar.db.permission.template.PermissionTemplateDao; import org.sonar.db.plugin.PluginDao; +import org.sonar.db.project.ProjectDao; import org.sonar.db.property.InternalComponentPropertiesDao; import org.sonar.db.property.InternalPropertiesDao; import org.sonar.db.property.PropertiesDao; @@ -135,6 +136,7 @@ public class DaoModule extends Module { PermissionTemplateCharacteristicDao.class, PermissionTemplateDao.class, PluginDao.class, + ProjectDao.class, ProjectLinkDao.class, ProjectMappingsDao.class, ProjectQgateAssociationDao.class, diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java b/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java index c7a3bea3ce1..9707a025944 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java @@ -59,6 +59,7 @@ import org.sonar.db.permission.UserPermissionDao; import org.sonar.db.permission.template.PermissionTemplateCharacteristicDao; import org.sonar.db.permission.template.PermissionTemplateDao; import org.sonar.db.plugin.PluginDao; +import org.sonar.db.project.ProjectDao; import org.sonar.db.property.InternalComponentPropertiesDao; import org.sonar.db.property.InternalPropertiesDao; import org.sonar.db.property.PropertiesDao; @@ -158,6 +159,7 @@ public class DbClient { private final ProjectMappingsDao projectMappingsDao; private final OrganizationAlmBindingDao organizationAlmBindingDao; private final NewCodePeriodDao newCodePeriodDao; + private final ProjectDao projectDao; public DbClient(Database database, MyBatis myBatis, DBSessions dbSessions, Dao... daos) { this.database = database; @@ -233,6 +235,7 @@ public class DbClient { organizationAlmBindingDao = getDao(map, OrganizationAlmBindingDao.class); internalComponentPropertiesDao = getDao(map, InternalComponentPropertiesDao.class); newCodePeriodDao = getDao(map, NewCodePeriodDao.class); + projectDao = getDao(map, ProjectDao.class); } public DbSession openSession(boolean batch) { @@ -311,6 +314,10 @@ public class DbClient { return componentDao; } + public ProjectDao projectDao() { + return projectDao; + } + public ComponentKeyUpdaterDao componentKeyUpdaterDao() { return componentKeyUpdaterDao; } 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 53cd1122e1c..0fc20ca8a47 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 @@ -102,6 +102,8 @@ import org.sonar.db.permission.template.PermissionTemplateMapper; import org.sonar.db.permission.template.PermissionTemplateUserDto; import org.sonar.db.plugin.PluginDto; import org.sonar.db.plugin.PluginMapper; +import org.sonar.db.project.ProjectDto; +import org.sonar.db.project.ProjectMapper; import org.sonar.db.property.InternalComponentPropertiesMapper; import org.sonar.db.property.InternalComponentPropertyDto; import org.sonar.db.property.InternalPropertiesMapper; @@ -202,6 +204,7 @@ public class MyBatis implements Startable { confBuilder.loadAlias("PrIssue", PrIssueDto.class); confBuilder.loadAlias("ProjectAlmBinding", ProjectAlmBindingDto.class); confBuilder.loadAlias("ProjectQgateAssociation", ProjectQgateAssociationDto.class); + confBuilder.loadAlias("Project", ProjectDto.class); confBuilder.loadAlias("ProjectMapping", ProjectMappingDto.class); confBuilder.loadAlias("PurgeableAnalysis", PurgeableAnalysisDto.class); confBuilder.loadAlias("QualityGateCondition", QualityGateConditionDto.class); @@ -267,6 +270,7 @@ public class MyBatis implements Startable { ProjectAlmBindingMapper.class, ProjectAlmSettingMapper.class, ProjectLinkMapper.class, + ProjectMapper.class, ProjectMappingsMapper.class, ProjectQgateAssociationMapper.class, PropertiesMapper.class, diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingDao.java index 7d73d4c341c..7e67ce74e70 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingDao.java @@ -25,6 +25,7 @@ import org.sonar.core.util.UuidFactory; import org.sonar.db.Dao; import org.sonar.db.DbSession; import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; public class ProjectAlmSettingDao implements Dao { @@ -49,8 +50,8 @@ public class ProjectAlmSettingDao implements Dao { projectAlmSettingDto.setUpdatedAt(now); } - public void deleteByProject(DbSession dbSession, ComponentDto project) { - getMapper(dbSession).deleteByProjectUuid(project.uuid()); + public void deleteByProject(DbSession dbSession, ProjectDto project) { + getMapper(dbSession).deleteByProjectUuid(project.getUuid()); } public void deleteByAlmSetting(DbSession dbSession, AlmSettingDto almSetting) { @@ -61,8 +62,8 @@ public class ProjectAlmSettingDao implements Dao { return getMapper(dbSession).countByAlmSettingUuid(almSetting.getUuid()); } - public Optional<ProjectAlmSettingDto> selectByProject(DbSession dbSession, ComponentDto project) { - return selectByProject(dbSession, project.uuid()); + public Optional<ProjectAlmSettingDto> selectByProject(DbSession dbSession, ProjectDto project) { + return selectByProject(dbSession, project.getUuid()); } public Optional<ProjectAlmSettingDto> selectByProject(DbSession dbSession, String projectUuid) { 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 434e04f1b51..bc116be2d0b 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 @@ -20,11 +20,14 @@ package org.sonar.db.component; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Optional; import org.sonar.api.utils.System2; import org.sonar.db.Dao; import org.sonar.db.DbSession; +import org.sonar.db.project.ProjectDto; import static org.sonar.db.DatabaseUtils.executeLargeInputs; @@ -72,6 +75,13 @@ public class BranchDao implements Dao { return selectByKey(dbSession, projectUuid, key, KeyType.BRANCH); } + public List<BranchDto> selectByBranchKeys(DbSession dbSession, Map<String, String> branchKeyByProjectUuid) { + if (branchKeyByProjectUuid.isEmpty()) { + return Collections.emptyList(); + } + return mapper(dbSession).selectByBranchKeys(branchKeyByProjectUuid); + } + public Optional<BranchDto> selectByPullRequestKey(DbSession dbSession, String projectUuid, String key) { return selectByKey(dbSession, projectUuid, key, KeyType.PULL_REQUEST); } @@ -88,6 +98,10 @@ public class BranchDao implements Dao { return mapper(dbSession).selectByProjectUuid(projectUuid); } + public Collection<BranchDto> selectByProject(DbSession dbSession, ProjectDto project) { + return mapper(dbSession).selectByProjectUuid(project.getUuid()); + } + public List<BranchDto> selectByUuids(DbSession session, Collection<String> uuids) { return executeLargeInputs(uuids, mapper(session)::selectByUuids); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java index 997d3a59516..fc7987f4572 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java @@ -21,8 +21,10 @@ package org.sonar.db.component; import java.util.Collection; import java.util.List; +import java.util.Map; import javax.annotation.Nullable; import org.apache.ibatis.annotations.Param; +import org.sonar.db.DbSession; public interface BranchMapper { @@ -43,6 +45,8 @@ public interface BranchMapper { Collection<BranchDto> selectByProjectUuid(@Param("projectUuid") String projectUuid); + List<BranchDto> selectByBranchKeys(@Param("branchKeyByProjectUuid") Map<String, String> branchKeyByProjectUuid); + List<BranchDto> selectByUuids(@Param("uuids") Collection<String> uuids); long countNonMainBranches(); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java index 710ef904c0f..54f0ba7b0df 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentDao.java @@ -73,14 +73,6 @@ public class ComponentDao implements Dao { return mapper(session).countByQuery(organizationUuid, query); } - @CheckForNull - private static String buildUpperLikeSql(@Nullable String textQuery) { - if (isBlank(textQuery)) { - return null; - } - return buildLikeValue(textQuery.toUpperCase(Locale.ENGLISH), BEFORE_AND_AFTER); - } - private static ComponentMapper mapper(DbSession session) { return session.getMapper(ComponentMapper.class); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentKeyUpdaterDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentKeyUpdaterDao.java index 10495b676b6..61dcb2242b6 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentKeyUpdaterDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentKeyUpdaterDao.java @@ -20,7 +20,6 @@ package org.sonar.db.component; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import java.util.Collection; import java.util.HashMap; @@ -36,10 +35,10 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; import org.apache.commons.lang.StringUtils; import org.sonar.api.resources.Qualifiers; +import org.sonar.api.resources.Scopes; import org.sonar.db.Dao; import org.sonar.db.DbSession; -import static com.google.common.base.Preconditions.checkArgument; import static org.sonar.core.component.ComponentKeys.checkProjectKey; /** @@ -48,25 +47,21 @@ import static org.sonar.core.component.ComponentKeys.checkProjectKey; * @since 3.2 */ public class ComponentKeyUpdaterDao implements Dao { - - private static final Set<String> PROJECT_OR_MODULE_QUALIFIERS = ImmutableSet.of(Qualifiers.PROJECT, Qualifiers.MODULE); - - public void updateKey(DbSession dbSession, String projectOrModuleUuid, String newKey) { + public void updateKey(DbSession dbSession, String projectUuid, String newKey) { ComponentKeyUpdaterMapper mapper = dbSession.getMapper(ComponentKeyUpdaterMapper.class); if (mapper.countResourceByKey(newKey) > 0) { throw new IllegalArgumentException("Impossible to update key: a component with key \"" + newKey + "\" already exists."); } // must SELECT first everything - ResourceDto project = mapper.selectProjectByUuid(projectOrModuleUuid); + ResourceDto project = mapper.selectProjectByUuid(projectUuid); String projectOldKey = project.getKey(); - List<ResourceDto> resources = mapper.selectProjectResources(projectOrModuleUuid); + List<ResourceDto> resources = mapper.selectProjectResources(projectUuid); resources.add(project); // add branch components - dbSession.getMapper(BranchMapper.class).selectByProjectUuid(projectOrModuleUuid) - .stream() - .filter(branch -> !projectOrModuleUuid.equals(branch.getUuid())) + dbSession.getMapper(BranchMapper.class).selectByProjectUuid(projectUuid).stream() + .filter(branch -> !projectUuid.equals(branch.getUuid())) .forEach(branch -> { resources.addAll(mapper.selectProjectResources(branch.getUuid())); resources.add(mapper.selectProjectByUuid(branch.getUuid())); @@ -77,10 +72,6 @@ public class ComponentKeyUpdaterDao implements Dao { }); } - public static void checkIsProjectOrModule(ComponentDto component) { - checkArgument(PROJECT_OR_MODULE_QUALIFIERS.contains(component.qualifier()), "Component updated must be a module or a key"); - } - /** * * @return a map with currentKey/newKey is a bulk update was executed @@ -118,8 +109,7 @@ public class ComponentKeyUpdaterDao implements Dao { // add branches (no check should be done as branch keys cannot be changed by the user) Map<String, String> branchBaseKeys = new HashMap<>(); - session.getMapper(BranchMapper.class).selectByProjectUuid(projectUuid) - .stream() + session.getMapper(BranchMapper.class).selectByProjectUuid(projectUuid).stream() .filter(branch -> !projectUuid.equals(branch.getUuid())) .forEach(branch -> { Set<ResourceDto> branchModules = collectAllModules(branch.getUuid(), stringToReplace, mapper, true); @@ -167,14 +157,18 @@ public class ComponentKeyUpdaterDao implements Dao { @Nullable BiConsumer<ResourceDto, String> consumer) { for (ResourceDto resource : resources) { String oldResourceKey = resource.getKey(); - String newResourceKey = newKey + oldResourceKey.substring(oldKey.length(), oldResourceKey.length()); + String newResourceKey = newKey + oldResourceKey.substring(oldKey.length()); resource.setKey(newResourceKey); String oldResourceDeprecatedKey = resource.getDeprecatedKey(); if (StringUtils.isNotBlank(oldResourceDeprecatedKey)) { - String newResourceDeprecatedKey = newKey + oldResourceDeprecatedKey.substring(oldKey.length(), oldResourceDeprecatedKey.length()); + String newResourceDeprecatedKey = newKey + oldResourceDeprecatedKey.substring(oldKey.length()); resource.setDeprecatedKey(newResourceDeprecatedKey); } - mapper.update(resource); + mapper.updateComponent(resource); + if (resource.getScope().equals(Scopes.PROJECT) && (resource.getQualifier().equals(Qualifiers.PROJECT) || resource.getQualifier().equals(Qualifiers.APP))) { + mapper.updateProject(oldResourceKey, newResourceKey); + } + if (consumer != null) { consumer.accept(resource, oldResourceKey); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentKeyUpdaterMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentKeyUpdaterMapper.java index c5c560db291..64c14ffce0b 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentKeyUpdaterMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ComponentKeyUpdaterMapper.java @@ -32,6 +32,8 @@ public interface ComponentKeyUpdaterMapper { List<ResourceDto> selectDescendantProjects(@Param("rootUuid") String rootUuid); - void update(ResourceDto resource); + void updateComponent(ResourceDto resource); + + void updateProject(@Param("oldProjectKey") String oldProjectKey, @Param("newProjectKey") String newProjectKey); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java index c700eef4330..37f74824907 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java @@ -29,6 +29,7 @@ import org.sonar.api.utils.DateUtils; import org.sonar.core.util.UuidFactoryFast; import org.sonar.core.util.Uuids; import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDto; @@ -47,13 +48,22 @@ public class IssueTesting { public static IssueDto newIssue(RuleDefinitionDto rule, ComponentDto project, ComponentDto file) { checkArgument(project.qualifier().equals(Qualifiers.PROJECT), "Second parameter should be a project"); - checkArgument(file.projectUuid().equals(project.uuid()), "The file doesn't belong to the project"); + return newIssue(rule, project.uuid(), project.getDbKey(), file); + } + + public static IssueDto newIssue(RuleDefinitionDto rule, ProjectDto project, ComponentDto file) { + return newIssue(rule, project.getUuid(), project.getKey(), file); + } + + public static IssueDto newIssue(RuleDefinitionDto rule, String projectUuid, String projectKey, ComponentDto file) { + checkArgument(file.projectUuid().equals(projectUuid), "The file doesn't belong to the project"); return new IssueDto() .setKee("uuid_" + randomAlphabetic(5)) .setRule(rule) .setType(RuleType.values()[nextInt(RuleType.values().length)]) - .setProject(project) + .setProjectUuid(projectUuid) + .setProjectKey(projectKey) .setComponent(file) .setStatus(Issue.STATUS_OPEN) .setResolution(null) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/measure/ProjectMeasuresIndexerIterator.java b/server/sonar-db-dao/src/main/java/org/sonar/db/measure/ProjectMeasuresIndexerIterator.java index 593256b3066..6892169d1b3 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/measure/ProjectMeasuresIndexerIterator.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/measure/ProjectMeasuresIndexerIterator.java @@ -69,10 +69,11 @@ public class ProjectMeasuresIndexerIterator extends CloseableIterator<ProjectMea CoreMetrics.NEW_LINES_KEY, CoreMetrics.NEW_RELIABILITY_RATING_KEY); + // TODO filter on enabled projects private static final String SQL_PROJECTS = "SELECT p.organization_uuid, p.uuid, p.kee, p.name, s.created_at, p.tags " + "FROM projects p " + "LEFT OUTER JOIN snapshots s ON s.component_uuid=p.uuid AND s.islast=? " + - "WHERE p.enabled=? AND p.scope=? AND p.qualifier=? and p.main_branch_project_uuid is null "; + "WHERE p.qualifier=?"; private static final String PROJECT_FILTER = " AND p.uuid=?"; @@ -130,11 +131,9 @@ public class ProjectMeasuresIndexerIterator extends CloseableIterator<ProjectMea } PreparedStatement stmt = session.getConnection().prepareStatement(sql.toString()); stmt.setBoolean(1, true); - stmt.setBoolean(2, true); - stmt.setString(3, Scopes.PROJECT); - stmt.setString(4, Qualifiers.PROJECT); + stmt.setString(2, Qualifiers.PROJECT); if (projectUuid != null) { - stmt.setString(5, projectUuid); + stmt.setString(3, projectUuid); } return stmt; } catch (SQLException e) { diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java new file mode 100644 index 00000000000..25550fac2d2 --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java @@ -0,0 +1,88 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.project; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import org.sonar.db.Dao; +import org.sonar.db.DbSession; + +public class ProjectDao implements Dao { + + public void insert(DbSession session, ProjectDto item) { + mapper(session).insert(item); + } + + public Optional<ProjectDto> selectProjectByKey(DbSession session, String key) { + return Optional.ofNullable(mapper(session).selectProjectByKey(key)); + } + + public Optional<ProjectDto> selectApplicationByKey(DbSession session, String key) { + return Optional.ofNullable(mapper(session).selectApplicationByKey(key)); + } + + public Optional<ProjectDto> selectProjectOrAppByKey(DbSession session, String key) { + return Optional.ofNullable(mapper(session).selectProjectOrAppByKey(key)); + } + + public List<ProjectDto> selectProjectsByKeys(DbSession session, Set<String> keys) { + if (keys.isEmpty()) { + return Collections.emptyList(); + } + return mapper(session).selectProjectsByKeys(keys); + } + + public List<ProjectDto> selectProjects(DbSession session) { + return mapper(session).selectProjects(); + } + + public Optional<ProjectDto> selectByUuid(DbSession session, String uuid) { + return Optional.ofNullable(mapper(session).selectByUuid(uuid)); + } + + public List<ProjectDto> selectByOrganizationUuid(DbSession session, String organizationUuid) { + return mapper(session).selectByOrganizationUuid(organizationUuid); + } + + public List<ProjectDto> selectProjectsByOrganizationUuid(DbSession session, String organizationUuid) { + return mapper(session).selectProjectsByOrganizationUuid(organizationUuid); + } + + public List<ProjectDto> selectByUuids(DbSession session, Set<String> uuids) { + if (uuids.isEmpty()) { + return Collections.emptyList(); + } + return mapper(session).selectByUuids(uuids); + } + + public void updateTags(DbSession session, ProjectDto project) { + mapper(session).updateTags(project); + } + + public void update(DbSession session, ProjectDto project) { + mapper(session).update(project); + } + + private static ProjectMapper mapper(DbSession session) { + return session.getMapper(ProjectMapper.class); + } +} diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDto.java new file mode 100644 index 00000000000..e01902c2eb5 --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDto.java @@ -0,0 +1,184 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.project; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import javax.annotation.CheckForNull; +import javax.annotation.Nullable; + +import static org.apache.commons.lang.StringUtils.trimToNull; +import static org.sonar.db.component.DbTagsReader.readDbTags; + +public class ProjectDto { + private static final String TAGS_SEPARATOR = ","; + private String uuid; + private String kee; + private String qualifier; + private String name; + private String description; + private boolean isPrivate = false; + private String tags; + private long createdAt; + private long updatedAt; + private String organizationUuid; + + public ProjectDto() { + // nothing to do here + } + + public long getCreatedAt() { + return createdAt; + } + + public ProjectDto setCreatedAt(long createdAt) { + this.createdAt = createdAt; + return this; + } + + public long getUpdatedAt() { + return updatedAt; + } + + public ProjectDto setUpdatedAt(long updatedAt) { + this.updatedAt = updatedAt; + return this; + } + + public String getUuid() { + return uuid; + } + + public ProjectDto setUuid(String uuid) { + this.uuid = uuid; + return this; + } + + /** + * This is the getter used by MyBatis mapper. + */ + public String getKee() { + return kee; + } + + public String getKey() { + return getKee(); + } + + /** + * This is the setter used by MyBatis mapper. + */ + public ProjectDto setKee(String kee) { + this.kee = kee; + return this; + } + + public ProjectDto setKey(String key) { + return setKee(key); + } + + public boolean isPrivate() { + return isPrivate; + } + + public ProjectDto setPrivate(boolean aPrivate) { + isPrivate = aPrivate; + return this; + } + + public List<String> getTags() { + return readDbTags(tags); + } + + public ProjectDto setTags(List<String> tags) { + setTagsString(tags.stream() + .filter(t -> !t.isEmpty()) + .collect(Collectors.joining(TAGS_SEPARATOR))); + return this; + } + + /** + * Used by MyBatis + */ + @CheckForNull + public String getTagsString() { + return tags; + } + + public ProjectDto setTagsString(@Nullable String tags) { + this.tags = trimToNull(tags); + return this; + } + + public String getOrganizationUuid() { + return organizationUuid; + } + + public ProjectDto setOrganizationUuid(String organizationUuid) { + this.organizationUuid = organizationUuid; + return this; + } + + public String getName() { + return name; + } + + public ProjectDto setName(String name) { + this.name = name; + return this; + } + + @CheckForNull + public String getDescription() { + return description; + } + + public ProjectDto setDescription(@Nullable String description) { + this.description = description; + return this; + } + + public String getQualifier() { + return qualifier; + } + + public ProjectDto setQualifier(String qualifier) { + this.qualifier = qualifier; + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ProjectDto that = (ProjectDto) o; + return Objects.equals(uuid, that.uuid); + } + + @Override + public int hashCode() { + return uuid != null ? uuid.hashCode() : 0; + } +} diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectMapper.java new file mode 100644 index 00000000000..754358ff2fe --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectMapper.java @@ -0,0 +1,56 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.project; + +import java.util.Collection; +import java.util.List; +import javax.annotation.CheckForNull; +import org.apache.ibatis.annotations.Param; + +public interface ProjectMapper { + + void insert(ProjectDto project); + + @CheckForNull + ProjectDto selectProjectByKey(String key); + + @CheckForNull + ProjectDto selectApplicationByKey(String key); + + @CheckForNull + ProjectDto selectProjectOrAppByKey(String key); + + List<ProjectDto> selectProjectsByKeys(@Param("kees") Collection<String> kees); + + @CheckForNull + ProjectDto selectByUuid(String uuid); + + List<ProjectDto> selectByUuids(@Param("uuids") Collection<String> uuids); + + List<ProjectDto> selectByOrganizationUuid(String organizationUuid); + + void updateTags(ProjectDto project); + + void update(ProjectDto project); + + List<ProjectDto> selectProjects(); + + List<ProjectDto> selectProjectsByOrganizationUuid(String organizationUuid); +} diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectQuery.java b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectQuery.java new file mode 100644 index 00000000000..266191ec81f --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectQuery.java @@ -0,0 +1,201 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.project; + +import java.util.Date; +import java.util.Locale; +import java.util.Set; +import java.util.stream.Stream; +import javax.annotation.CheckForNull; +import javax.annotation.Nullable; +import org.sonar.db.WildcardPosition; + +import static com.google.common.base.Preconditions.checkArgument; +import static org.sonar.db.DaoUtils.buildLikeValue; + +public class ProjectQuery { + private final String nameOrKeyQuery; + private final boolean partialMatchOnKey; + private final Boolean isPrivate; + private final Set<String> projectUuids; + private final Set<String> projectKeys; + private final Long analyzedBefore; + private final Long anyBranchAnalyzedBefore; + private final Long anyBranchAnalyzedAfter; + private final Date createdAfter; + private final boolean onProvisionedOnly; + + private ProjectQuery(ProjectQuery.Builder builder) { + this.nameOrKeyQuery = builder.nameOrKeyQuery; + this.partialMatchOnKey = builder.partialMatchOnKey != null && builder.partialMatchOnKey; + this.projectUuids = builder.projectUuids; + this.projectKeys = builder.projectKeys; + this.isPrivate = builder.isPrivate; + this.analyzedBefore = builder.analyzedBefore; + this.anyBranchAnalyzedBefore = builder.anyBranchAnalyzedBefore; + this.anyBranchAnalyzedAfter = builder.anyBranchAnalyzedAfter; + this.createdAfter = builder.createdAfter; + this.onProvisionedOnly = builder.onProvisionedOnly; + } + + @CheckForNull + public String getNameOrKeyQuery() { + return nameOrKeyQuery; + } + + /** + * Used by MyBatis mapper + */ + @CheckForNull + public String getNameOrKeyUpperLikeQuery() { + return buildLikeValue(nameOrKeyQuery, WildcardPosition.BEFORE_AND_AFTER).toUpperCase(Locale.ENGLISH); + } + + /** + * Used by MyBatis mapper + */ + public boolean isPartialMatchOnKey() { + return partialMatchOnKey; + } + + @CheckForNull + public Set<String> getProjectUuids() { + return projectUuids; + } + + @CheckForNull + public Set<String> getProjectKeys() { + return projectKeys; + } + + @CheckForNull + public Boolean getPrivate() { + return isPrivate; + } + + @CheckForNull + public Long getAnalyzedBefore() { + return analyzedBefore; + } + + @CheckForNull + public Long getAnyBranchAnalyzedBefore() { + return anyBranchAnalyzedBefore; + } + + @CheckForNull + public Long getAnyBranchAnalyzedAfter() { + return anyBranchAnalyzedAfter; + } + + @CheckForNull + public Date getCreatedAfter() { + return createdAfter; + } + + public boolean isOnProvisionedOnly() { + return onProvisionedOnly; + } + + boolean hasEmptySetOfProjects() { + return Stream.of(projectKeys, projectUuids) + .anyMatch(list -> list != null && list.isEmpty()); + } + + public static ProjectQuery.Builder builder() { + return new ProjectQuery.Builder(); + } + + public static class Builder { + private String nameOrKeyQuery; + private Boolean partialMatchOnKey; + private Boolean isPrivate; + private Set<String> projectUuids; + private Set<String> projectKeys; + private Long analyzedBefore; + private Long anyBranchAnalyzedBefore; + private Long anyBranchAnalyzedAfter; + private Date createdAfter; + private boolean onProvisionedOnly = false; + + public ProjectQuery.Builder setNameOrKeyQuery(@Nullable String nameOrKeyQuery) { + this.nameOrKeyQuery = nameOrKeyQuery; + return this; + } + + /** + * Beware, can be resource intensive! Should be used with precautions. + */ + public ProjectQuery.Builder setPartialMatchOnKey(@Nullable Boolean partialMatchOnKey) { + this.partialMatchOnKey = partialMatchOnKey; + return this; + } + + public ProjectQuery.Builder setProjectUuids(@Nullable Set<String> projectUuids) { + this.projectUuids = projectUuids; + return this; + } + + public ProjectQuery.Builder setProjectKeys(@Nullable Set<String> projectKeys) { + this.projectKeys = projectKeys; + return this; + } + + public ProjectQuery.Builder setPrivate(@Nullable Boolean isPrivate) { + this.isPrivate = isPrivate; + return this; + } + + public ProjectQuery.Builder setAnalyzedBefore(@Nullable Long l) { + this.analyzedBefore = l; + return this; + } + + public ProjectQuery.Builder setAnyBranchAnalyzedBefore(@Nullable Long l) { + this.anyBranchAnalyzedBefore = l; + return this; + } + + /** + * Filter on date of last analysis. On projects, all branches and pull requests are taken into + * account. For example the analysis of a branch is included in the filter + * even if the main branch has never been analyzed. + */ + public ProjectQuery.Builder setAnyBranchAnalyzedAfter(@Nullable Long l) { + this.anyBranchAnalyzedAfter = l; + return this; + } + + public ProjectQuery.Builder setCreatedAfter(@Nullable Date l) { + this.createdAfter = l; + return this; + } + + public ProjectQuery.Builder setOnProvisionedOnly(boolean onProvisionedOnly) { + this.onProvisionedOnly = onProvisionedOnly; + return this; + } + + public ProjectQuery build() { + checkArgument(nameOrKeyQuery != null || partialMatchOnKey == null, "A query must be provided if a partial match on key is specified."); + return new ProjectQuery(this); + } + } +} diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/project/package-info.java b/server/sonar-db-dao/src/main/java/org/sonar/db/project/package-info.java new file mode 100644 index 00000000000..b2e9cab60f2 --- /dev/null +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/project/package-info.java @@ -0,0 +1,24 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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. + */ +@ParametersAreNonnullByDefault +package org.sonar.db.project; + +import javax.annotation.ParametersAreNonnullByDefault; + diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java index 4e07b384823..b3a902160b1 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/property/PropertiesDao.java @@ -109,7 +109,7 @@ public class PropertiesDao implements Dao { private static PreparedStatement createStatement(String projectUuid, Collection<String> dispatcherKeys, Connection connection) throws SQLException { String sql = "SELECT count(1) FROM properties pp " + - "left outer join projects pj on pp.resource_id = pj.id " + + "left outer join components pj on pp.resource_id = pj.id " + "where pp.user_id is not null and (pp.resource_id is null or pj.uuid=?) " + "and (" + repeat("pp.prop_key like ?", " or ", dispatcherKeys.size()) + ")"; PreparedStatement res = connection.prepareStatement(sql); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java index 7fad045f441..1cfa3e45f7f 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java @@ -283,6 +283,13 @@ class PurgeCommands { profiler.stop(); } + void deleteProject(String projectUuid) { + profiler.start("deleteProject (projects)"); + purgeMapper.deleteProjectsByProjectUuid(projectUuid); + session.commit(); + profiler.stop(); + } + void deleteComponents(List<String> componentUuids) { if (componentUuids.isEmpty()) { return; diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeDao.java index 7d335530f5b..107a444bfd9 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeDao.java @@ -211,8 +211,7 @@ public class PurgeDao implements Dao { PurgeMapper purgeMapper = mapper(session); PurgeCommands purgeCommands = new PurgeCommands(session, profiler, system2); - session.getMapper(BranchMapper.class).selectByProjectUuid(uuid) - .stream() + session.getMapper(BranchMapper.class).selectByProjectUuid(uuid).stream() .filter(branch -> !uuid.equals(branch.getUuid())) .forEach(branch -> deleteRootComponent(branch.getUuid(), purgeMapper, purgeCommands)); @@ -242,6 +241,7 @@ public class PurgeDao implements Dao { commands.deleteNewCodePeriods(rootUuid); commands.deleteBranch(rootUuid); commands.deleteComponents(rootUuid); + commands.deleteProject(rootUuid); } /** diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java index bc712a70be2..049cb8792b6 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java @@ -74,6 +74,8 @@ public interface PurgeMapper { void deleteComponentsByProjectUuid(@Param("rootUuid") String rootUuid); + void deleteProjectsByProjectUuid(@Param("projectUuid") String projectUuid); + void deleteComponentsByUuids(@Param("componentUuids") List<String> componentUuids); void deleteGroupRolesByComponentId(@Param("rootId") long rootId); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationDao.java index d16e00382fc..83ec55bb9fa 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationDao.java @@ -31,11 +31,11 @@ public class ProjectQgateAssociationDao implements Dao { } /** - * @return quality gate uuid if a specific Quality Gate has been defined for the given component uuid. <br> + * @return quality gate uuid if a specific Quality Gate has been defined for the given project uuid. <br> * Returns <code>{@link Optional#empty()}</code> otherwise (ex: default quality gate applies) */ - public Optional<String> selectQGateUuidByComponentUuid(DbSession dbSession, String componentUuid) { - String uuid = mapper(dbSession).selectQGateUuidByComponentUuid(componentUuid); + public Optional<String> selectQGateUuidByProjectUuid(DbSession dbSession, String projectUuid) { + String uuid = mapper(dbSession).selectQGateUuidByProjectUuid(projectUuid); return Optional.ofNullable(uuid); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.java index 36db6cce990..a2c68932497 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.java @@ -28,7 +28,7 @@ public interface ProjectQgateAssociationMapper { List<ProjectQgateAssociationDto> selectProjects(@Param("query") ProjectQgateAssociationQuery query); @CheckForNull - String selectQGateUuidByComponentUuid(String componentUuid); + String selectQGateUuidByProjectUuid(String projectUuid); void deleteByProjectUuid(String projectUuid); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/QualityGateDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/QualityGateDao.java index 763b5ac08df..02deb13e0ac 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/QualityGateDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/QualityGateDao.java @@ -107,7 +107,7 @@ public class QualityGateDao implements Dao { return session.getMapper(QualityGateMapper.class); } - public QualityGateDto selectByProjectUuid(DbSession dbSession, String uuid) { - return mapper(dbSession).selectByProjectUuid(uuid); + public QualityGateDto selectByProjectUuid(DbSession dbSession, String projectUuid) { + return mapper(dbSession).selectByProjectUuid(projectUuid); } } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java index 273c089addc..90f8d985a14 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java @@ -35,8 +35,8 @@ import org.sonar.db.DatabaseUtils; import org.sonar.db.DbSession; import org.sonar.db.KeyLongValue; import org.sonar.db.RowNotFoundException; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Collections.emptyList; @@ -156,12 +156,12 @@ public class QualityProfileDao implements Dao { } @CheckForNull - public QProfileDto selectAssociatedToProjectAndLanguage(DbSession dbSession, ComponentDto project, String language) { - return mapper(dbSession).selectAssociatedToProjectUuidAndLanguage(project.getOrganizationUuid(), project.projectUuid(), language); + public QProfileDto selectAssociatedToProjectAndLanguage(DbSession dbSession, ProjectDto project, String language) { + return mapper(dbSession).selectAssociatedToProjectUuidAndLanguage(project.getOrganizationUuid(), project.getUuid(), language); } - public List<QProfileDto> selectAssociatedToProjectUuidAndLanguages(DbSession dbSession, ComponentDto project, Collection<String> languages) { - return executeLargeInputs(languages, partition -> mapper(dbSession).selectAssociatedToProjectUuidAndLanguages(project.getOrganizationUuid(), project.uuid(), partition)); + public List<QProfileDto> selectAssociatedToProjectUuidAndLanguages(DbSession dbSession, ProjectDto project, Collection<String> languages) { + return executeLargeInputs(languages, partition -> mapper(dbSession).selectAssociatedToProjectUuidAndLanguages(project.getOrganizationUuid(), project.getUuid(), partition)); } public List<QProfileDto> selectByLanguage(DbSession dbSession, OrganizationDto organization, String language) { @@ -205,16 +205,16 @@ public class QualityProfileDao implements Dao { return KeyLongValue.toMap(executeLargeInputs(profileUuids, partition -> mapper(dbSession).countProjectsByOrganizationAndProfiles(organization.getUuid(), partition))); } - public void insertProjectProfileAssociation(DbSession dbSession, ComponentDto project, QProfileDto profile) { - mapper(dbSession).insertProjectProfileAssociation(project.uuid(), profile.getKee()); + public void insertProjectProfileAssociation(DbSession dbSession, ProjectDto project, QProfileDto profile) { + mapper(dbSession).insertProjectProfileAssociation(project.getUuid(), profile.getKee()); } - public void deleteProjectProfileAssociation(DbSession dbSession, ComponentDto project, QProfileDto profile) { - mapper(dbSession).deleteProjectProfileAssociation(project.uuid(), profile.getKee()); + public void deleteProjectProfileAssociation(DbSession dbSession, ProjectDto project, QProfileDto profile) { + mapper(dbSession).deleteProjectProfileAssociation(project.getUuid(), profile.getKee()); } - public void updateProjectProfileAssociation(DbSession dbSession, ComponentDto project, String newProfileUuid, String oldProfileUuid) { - mapper(dbSession).updateProjectProfileAssociation(project.uuid(), newProfileUuid, oldProfileUuid); + public void updateProjectProfileAssociation(DbSession dbSession, ProjectDto project, String newProfileUuid, String oldProfileUuid) { + mapper(dbSession).updateProjectProfileAssociation(project.getUuid(), newProfileUuid, oldProfileUuid); } public void deleteProjectAssociationsByProfileUuids(DbSession dbSession, Collection<String> profileUuids) { diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java index 5a282bf4b90..f8b1b12be31 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/user/UserDao.java @@ -36,6 +36,7 @@ import org.sonar.db.Dao; import org.sonar.db.DbSession; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static java.util.Locale.ENGLISH; import static org.sonar.db.DatabaseUtils.executeLargeInputs; @@ -143,6 +144,10 @@ public class UserDao implements Dao { mapper(dbSession).clearHomepages("ORGANIZATION", organization.getUuid(), system2.now()); } + public void cleanHomepage(DbSession dbSession, ProjectDto project) { + mapper(dbSession).clearHomepages("PROJECT", project.getUuid(), system2.now()); + } + public void cleanHomepage(DbSession dbSession, ComponentDto project) { mapper(dbSession).clearHomepages("PROJECT", project.uuid(), system2.now()); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDao.java index 98d3d5ef671..bbed39b4fa0 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/webhook/WebhookDao.java @@ -26,6 +26,7 @@ import org.sonar.db.Dao; import org.sonar.db.DbSession; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static com.google.common.base.Preconditions.checkState; @@ -49,8 +50,8 @@ public class WebhookDao implements Dao { return mapper(dbSession).selectForOrganizationUuidOrderedByName(organizationUuid); } - public List<WebhookDto> selectByProject(DbSession dbSession, ComponentDto componentDto) { - return mapper(dbSession).selectForProjectUuidOrderedByName(componentDto.uuid()); + public List<WebhookDto> selectByProject(DbSession dbSession, ProjectDto projectDto) { + return mapper(dbSession).selectForProjectUuidOrderedByName(projectDto.getUuid()); } public void insert(DbSession dbSession, WebhookDto dto) { @@ -73,8 +74,8 @@ public class WebhookDao implements Dao { mapper(dbSession).deleteForOrganizationUuid(organization.getUuid()); } - public void deleteByProject(DbSession dbSession, ComponentDto componentDto) { - mapper(dbSession).deleteForProjectUuid(componentDto.uuid()); + public void deleteByProject(DbSession dbSession, ProjectDto projectDto) { + mapper(dbSession).deleteForProjectUuid(projectDto.getUuid()); } private static WebhookMapper mapper(DbSession dbSession) { diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/ProjectAlmBindingMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/ProjectAlmBindingMapper.xml index 845af9e7d2e..96152fe03a1 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/ProjectAlmBindingMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/ProjectAlmBindingMapper.xml @@ -95,7 +95,7 @@ p.kee as projectKey from project_alm_bindings b - inner join projects p + inner join components p on b.project_uuid = p.project_uuid where alm_id = #{almId, jdbcType=VARCHAR} diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml index d65e0a48a69..50a30adbbc9 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml @@ -76,6 +76,16 @@ pb.key_type = #{keyType, jdbcType=VARCHAR} </select> + <select id="selectByBranchKeys" resultType="org.sonar.db.component.BranchDto"> + select + <include refid="columns" /> + from project_branches pb + where + <foreach collection="branchKeyByProjectUuid" index="key" item="value" open="" separator=" or " close=""> + (pb.project_uuid=#{key,jdbcType=VARCHAR} and pb.kee=#{value,jdbcType=VARCHAR}) + </foreach> + </select> + <select id="selectByProjectUuid" parameterType="string" resultType="org.sonar.db.component.BranchDto"> select <include refid="columns" /> from project_branches pb diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentKeyUpdaterMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentKeyUpdaterMapper.xml index f0afa194b75..d215bb58a2a 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentKeyUpdaterMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentKeyUpdaterMapper.xml @@ -15,35 +15,41 @@ <select id="countResourceByKey" parameterType="String" resultType="int"> SELECT count(1) - FROM projects + FROM components WHERE kee = #{key,jdbcType=VARCHAR} </select> <select id="selectProjectByUuid" parameterType="String" resultMap="resourceResultMap"> - select * from projects + select * from components where uuid = #{uuid,jdbcType=VARCHAR} </select> <select id="selectProjectResources" parameterType="String" resultMap="resourceResultMap"> - select * from projects + select * from components where root_uuid = #{rootUuid,jdbcType=VARCHAR} and scope != 'PRJ' </select> <select id="selectDescendantProjects" parameterType="String" resultMap="resourceResultMap"> - select * from projects + select * from components where scope='PRJ' and root_uuid = #{rootUuid,jdbcType=VARCHAR} and uuid != #{rootUuid,jdbcType=VARCHAR} </select> - <update id="update" parameterType="Resource"> - update projects + <update id="updateComponent" parameterType="Resource"> + update components set kee = #{key,jdbcType=VARCHAR}, deprecated_kee = #{deprecatedKey,jdbcType=VARCHAR} where id = #{id,jdbcType=BIGINT} </update> + <update id="updateProject"> + update projects + set kee = #{newProjectKey,jdbcType=VARCHAR} + where kee = #{oldProjectKey,jdbcType=VARCHAR} + </update> + </mapper> diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml index 6134fb1eda2..3acf8b919bf 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml @@ -30,7 +30,7 @@ <select id="selectByKey" parameterType="String" resultType="Component"> SELECT <include refid="componentColumns"/> - FROM projects p + FROM components p where p.kee=#{key,jdbcType=VARCHAR} </select> @@ -38,7 +38,7 @@ <select id="selectBranchByKeyAndBranchKey" parameterType="String" resultType="Component"> select <include refid="componentColumns"/> - from projects p + from components p inner join project_branches pb on pb.uuid = p.project_uuid where (p.kee=#{dbKey,jdbcType=VARCHAR} OR p.kee=#{key,jdbcType=VARCHAR}) @@ -49,7 +49,7 @@ <select id="selectPrByKeyAndBranchKey" parameterType="String" resultType="Component"> select <include refid="componentColumns"/> - from projects p + from components p inner join project_branches pb on pb.uuid = p.project_uuid where (p.kee=#{dbKey,jdbcType=VARCHAR} OR p.kee=#{key,jdbcType=VARCHAR}) @@ -60,14 +60,14 @@ <select id="selectById" parameterType="long" resultType="Component"> SELECT <include refid="componentColumns"/> - FROM projects p + FROM components p where p.id = #{id,jdbcType=BIGINT} </select> <select id="selectByUuid" parameterType="String" resultType="Component"> SELECT <include refid="componentColumns"/> - FROM projects p + FROM components p where p.uuid=#{uuid,jdbcType=VARCHAR} </select> @@ -76,7 +76,7 @@ select <include refid="componentColumns"/> from - projects p + components p inner join project_alm_bindings pab on pab.project_uuid = p.uuid where @@ -86,8 +86,8 @@ <select id="selectByProjectUuid" parameterType="string" resultType="Component"> select <include refid="componentColumns"/> - from projects root - inner join projects p on p.project_uuid=root.uuid and p.organization_uuid=root.organization_uuid + from components root + inner join components p on p.project_uuid=root.uuid and p.organization_uuid=root.organization_uuid where root.uuid=#{projectUuid,jdbcType=VARCHAR} </select> @@ -95,7 +95,7 @@ <select id="selectByKeys" parameterType="String" resultType="Component"> select <include refid="componentColumns"/> - from projects p + from components p where p.enabled=${_true} and p.main_branch_project_uuid is null @@ -108,7 +108,7 @@ <select id="selectByDbKeys" parameterType="String" resultType="Component"> select <include refid="componentColumns"/> - from projects p + from components p where p.enabled=${_true} and p.kee in @@ -120,7 +120,7 @@ <select id="selectByKeysAndBranch" parameterType="String" resultType="Component"> SELECT <include refid="componentColumns"/> - FROM projects p + FROM components p INNER JOIN project_branches pb on pb.uuid = p.project_uuid <where> p.enabled=${_true} @@ -135,7 +135,7 @@ <select id="selectByIds" parameterType="long" resultType="Component"> select <include refid="componentColumns"/> - from projects p + from components p where p.enabled=${_true} and p.id in @@ -147,7 +147,7 @@ <select id="selectByUuids" parameterType="String" resultType="Component"> select <include refid="componentColumns"/> - from projects p + from components p where p.uuid in <foreach collection="uuids" open="(" close=")" item="uuid" separator=","> @@ -157,7 +157,7 @@ <select id="selectExistingUuids" parameterType="String" resultType="String"> select p.uuid - from projects p + from components p where p.uuid in <foreach collection="uuids" open="(" close=")" item="uuid" separator=","> @@ -168,8 +168,8 @@ <select id="selectSubProjectsByComponentUuids" parameterType="String" resultType="Component"> SELECT <include refid="componentColumns"/> - FROM projects p - INNER JOIN projects child ON + FROM components p + INNER JOIN components child ON child.root_uuid=p.uuid and child.enabled=${_true} and child.organization_uuid=p.organization_uuid @@ -185,12 +185,12 @@ <select id="selectDescendantModules" parameterType="map" resultType="Component"> SELECT <include refid="componentColumns"/> - FROM projects p + FROM components p <include refid="modulesTreeQuery"/> </select> <sql id="modulesTreeQuery"> - INNER JOIN projects module ON + INNER JOIN components module ON module.project_uuid = p.project_uuid and module.organization_uuid = p.organization_uuid and module.uuid = #{moduleUuid} @@ -218,8 +218,8 @@ p.module_uuid as moduleUuid, fs.src_hash as srcHash, fs.revision - FROM projects root - INNER JOIN projects p on + FROM components root + INNER JOIN components p on p.project_uuid=root.uuid and p.organization_uuid=root.organization_uuid and p.enabled=${_true} @@ -237,7 +237,7 @@ p.module_uuid as moduleUuid, fs.src_hash as srcHash, fs.revision - FROM projects p + FROM components p INNER JOIN file_sources fs ON fs.file_uuid=p.uuid <include refid="modulesTreeQuery"/> @@ -246,7 +246,7 @@ <select id="selectProjects" resultType="Component"> select <include refid="componentColumns"/> - from projects p + from components p where p.enabled=${_true} AND p.scope='PRJ' @@ -257,7 +257,7 @@ <select id="selectProjectsByOrganization" resultType="Component"> select <include refid="componentColumns"/> - from projects p + from components p where p.enabled=${_true} and p.scope='PRJ' @@ -269,7 +269,7 @@ <select id="selectComponentsByQualifiers" resultType="Component"> SELECT <include refid="componentColumns"/> - FROM projects p + FROM components p where <foreach collection="qualifiers" open="(" close=")" item="qualifier" separator="OR "> p.qualifier=#{qualifier,jdbcType=VARCHAR} @@ -279,7 +279,7 @@ <select id="countEnabledModulesByProjectUuid" resultType="int"> select count(1) - from projects p + from components p where p.enabled=${_true} and p.project_uuid = #{projectUuid,jdbcType=VARCHAR} @@ -289,7 +289,7 @@ <select id="countComponentByOrganizationAndId" resultType="int"> select count(1) - from projects p + from components p where p.organization_uuid = #{organizationUuid,jdbcType=VARCHAR} and p.id = #{componentId,jdbcType=BIGINT} @@ -308,7 +308,7 @@ </select> <sql id="sqlSelectByQuery"> - from projects p + from components p <if test="query.analyzedBefore!=null"> inner join snapshots sa on sa.component_uuid=p.uuid and sa.status='P' and sa.islast=${_true} and sa.created_at < #{query.analyzedBefore,jdbcType=BIGINT} @@ -424,7 +424,7 @@ <select id="selectDescendants" resultType="Component"> select <include refid="componentColumns"/> - from projects p + from components p <include refid="selectDescendantsJoins"/> <where> <include refid="selectDescendantsFilters"/> @@ -432,7 +432,7 @@ </select> <sql id="selectDescendantsJoins"> - inner join projects base on base.project_uuid = p.project_uuid and base.uuid = #{baseUuid} + inner join components base on base.project_uuid = p.project_uuid and base.uuid = #{baseUuid} <choose> <when test="query.getStrategy().name() == 'CHILDREN'"> and p.uuid_path = #{baseUuidPath,jdbcType=VARCHAR} @@ -467,7 +467,7 @@ </sql> <select id="selectUuidsForQualifiers" resultType="UuidWithProjectUuid"> - SELECT p.uuid as "uuid", p.project_uuid as "projectUuid" FROM projects p + SELECT p.uuid as "uuid", p.project_uuid as "projectUuid" FROM components p where <foreach collection="qualifiers" open="(" close=")" item="qualifier" separator="OR "> p.qualifier=#{qualifier,jdbcType=VARCHAR} @@ -477,8 +477,8 @@ <select id="selectViewKeysWithEnabledCopyOfProject" resultType="String"> select distinct p.kee - from projects p - inner join projects leaf on + from components p + inner join components leaf on leaf.qualifier = 'TRK' and leaf.scope = 'FIL' and leaf.enabled = ${_true} @@ -493,7 +493,7 @@ <select id="selectProjectsFromView" resultType="String"> select p.copy_component_uuid - from projects p + from components p where p.enabled = ${_true} and p.project_uuid = #{projectViewUuid,jdbcType=VARCHAR} @@ -505,8 +505,8 @@ <select id="selectComponentsFromProjectKeyAndScope" parameterType="map" resultType="Component"> SELECT <include refid="componentColumns"/> - FROM projects p - INNER JOIN projects root ON root.uuid=p.project_uuid AND root.kee=#{projectKey,jdbcType=VARCHAR} + FROM components p + INNER JOIN components root ON root.uuid=p.project_uuid AND root.kee=#{projectKey,jdbcType=VARCHAR} <where> <if test="excludeDisabled"> p.enabled = ${_true} @@ -521,24 +521,24 @@ SELECT p.uuid as uuid, p.module_uuid as moduleUuid, p.path as path, p.scope as scope FROM - projects p + components p INNER JOIN - projects root ON root.uuid=p.project_uuid AND p.enabled = ${_true} AND root.kee=#{projectKey,jdbcType=VARCHAR} + components root ON root.uuid=p.project_uuid AND p.enabled = ${_true} AND root.kee=#{projectKey,jdbcType=VARCHAR} </select> <select id="selectUuidsByKeyFromProjectKey" parameterType="string" resultType="KeyWithUuid"> SELECT p.kee, p.uuid FROM - projects p + components p INNER JOIN - projects root ON root.uuid=p.project_uuid AND root.kee=#{projectKey,jdbcType=VARCHAR} + components root ON root.uuid=p.project_uuid AND root.kee=#{projectKey,jdbcType=VARCHAR} </select> <select id="scrollForIndexing" parameterType="map" resultType="Component" fetchSize="${_scrollFetchSize}" resultSetType="FORWARD_ONLY"> select <include refid="componentColumns"/> - from projects p + from components p where p.enabled=${_true} and p.copy_component_uuid is null @@ -555,7 +555,7 @@ p.kee as kee, p.path as path, fs.line_count as lineCount - from projects p + from components p inner join file_sources fs on fs.file_uuid = p.uuid where @@ -567,7 +567,7 @@ </select> <insert id="insert" parameterType="Component" keyColumn="id" useGeneratedKeys="true" keyProperty="id"> - INSERT INTO projects ( + INSERT INTO components ( organization_uuid, kee, uuid, @@ -640,14 +640,14 @@ </insert> <update id="updateTags" parameterType="Component" useGeneratedKeys="false"> - update projects set + update components set tags = #{tagsString,jdbcType=VARCHAR} where uuid = #{uuid,jdbcType=VARCHAR} </update> <update id="update" parameterType="org.sonar.db.component.ComponentUpdateDto" useGeneratedKeys="false"> - update projects set + update components set b_changed = #{bChanged,jdbcType=BOOLEAN}, <!-- Component key is normally immutable, but since 7.6 deprecated_kee is used as a b_kee to migrate component keys after the drop of modules --> deprecated_kee = #{bKey,jdbcType=VARCHAR}, @@ -667,7 +667,7 @@ </update> <update id="updateBEnabledToFalse" parameterType="org.sonar.db.component.ComponentUpdateDto" useGeneratedKeys="false"> - update projects set + update components set b_changed = ${_true}, <!-- Component key is normally immutable, but since 7.6 deprecated_kee is used as a b_kee to migrate component keys after the drop of modules --> deprecated_kee = kee, @@ -687,7 +687,7 @@ </update> <update id="applyBChangesForRootComponentUuid" parameterType="string" useGeneratedKeys="false"> - update projects set + update components set <!-- Component key is normally immutable, but since 7.6 deprecated_kee is used as a b_kee to migrate component keys after the drop of modules --> kee = deprecated_kee, copy_component_uuid = b_copy_component_uuid, @@ -733,7 +733,7 @@ </update> <update id="resetBChangedForRootComponentUuid" parameterType="map" > - update projects + update components set b_changed = ${_false}, <!-- Component key is normally immutable, but since 7.6 deprecated_kee is used as a b_kee to migrate component keys after the drop of modules --> deprecated_kee = kee @@ -743,7 +743,7 @@ </update> <update id="setPrivateForRootComponentUuid" parameterType="map" > - update projects set + update components set private = #{isPrivate,jdbcType=BOOLEAN} where project_uuid = #{projectUuid,jdbcType=VARCHAR} @@ -751,11 +751,11 @@ </update> <delete id="delete" parameterType="long"> - DELETE FROM projects WHERE id=#{id,jdbcType=BIGINT} + DELETE FROM components WHERE id=#{id,jdbcType=BIGINT} </delete> <select id="selectAllSiblingComponentKeysHavingOpenIssues" resultType="KeyWithUuid"> - SELECT DISTINCT p.kee as kee, p.uuid as uuid FROM projects p + SELECT DISTINCT p.kee as kee, p.uuid as uuid FROM components p JOIN issues i ON p.uuid = i.component_uuid JOIN project_branches b @@ -771,7 +771,7 @@ from live_measures lm inner join metrics m on m.id = lm.metric_id inner join project_branches b on b.uuid = lm.component_uuid - inner join projects p on b.project_uuid = p.uuid + inner join components p on b.project_uuid = p.uuid where m.name = 'ncloc' and b.key_type = 'BRANCH' diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/SnapshotMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/SnapshotMapper.xml index b4a648e2828..082040e4bed 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/SnapshotMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/SnapshotMapper.xml @@ -39,7 +39,7 @@ <select id="selectLastSnapshotByComponentUuid" resultType="Snapshot"> select <include refid="snapshotColumns" /> from snapshots s - inner join projects p on s.component_uuid = p.project_uuid + inner join components p on s.component_uuid = p.project_uuid where s.islast=${_true} and p.uuid = #{componentUuid,jdbcType=VARCHAR} @@ -67,7 +67,7 @@ <include refid="snapshotColumns" /> FROM snapshots s <if test="query.componentUuid != null"> - INNER JOIN projects p ON p.uuid=s.component_uuid AND p.enabled=${_true} AND s.component_uuid=#{query.componentUuid,jdbcType=VARCHAR} + INNER JOIN components p ON p.uuid=s.component_uuid AND p.enabled=${_true} AND s.component_uuid=#{query.componentUuid,jdbcType=VARCHAR} </if> <where> <if test="query.status != null"> @@ -104,7 +104,7 @@ select <include refid="snapshotColumns" /> from snapshots s - inner join projects p on p.uuid=s.component_uuid and p.enabled=${_true} + inner join components p on p.uuid=s.component_uuid and p.enabled=${_true} inner join project_branches pb on pb.uuid=p.uuid where <foreach collection="componentUuidFromDatePairs" open="(" close=")" item="componentUuidFromDatePair" separator=" or "> diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/duplication/DuplicationMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/duplication/DuplicationMapper.xml index d24950c4c99..64f3fc648b5 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/duplication/DuplicationMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/duplication/DuplicationMapper.xml @@ -15,7 +15,7 @@ file_component.kee as componentKey FROM duplications_index duplication_block INNER JOIN snapshots snapshot ON duplication_block.analysis_uuid=snapshot.uuid AND snapshot.islast=${_true} - INNER JOIN projects file_component ON file_component.uuid=duplication_block.component_uuid AND file_component.language=#{language} + INNER JOIN components file_component ON file_component.uuid=duplication_block.component_uuid AND file_component.language=#{language} AND file_component.enabled=${_true} <where> AND duplication_block.hash in diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/issue/IssueMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/issue/IssueMapper.xml index 37ea21fbe49..368414c60a7 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/issue/IssueMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/issue/IssueMapper.xml @@ -181,8 +181,8 @@ <include refid="issueColumns"/> from issues i inner join rules r on r.id=i.rule_id - inner join projects p on p.uuid=i.component_uuid - inner join projects root on root.uuid=i.project_uuid + inner join components p on p.uuid=i.component_uuid + inner join components root on root.uuid=i.project_uuid where i.kee=#{kee,jdbcType=VARCHAR} </select> @@ -191,8 +191,8 @@ <include refid="issueColumns"/> from issues i inner join rules r on r.id=i.rule_id - inner join projects p on p.uuid=i.component_uuid - inner join projects root on root.uuid=i.project_uuid + inner join components p on p.uuid=i.component_uuid + inner join components root on root.uuid=i.project_uuid where i.component_uuid = #{componentUuid,jdbcType=VARCHAR} and i.status <> 'CLOSED' @@ -203,8 +203,8 @@ <include refid="issueColumns"/> from issues i inner join rules r on r.id=i.rule_id - inner join projects p on p.uuid=i.component_uuid - inner join projects root on root.uuid=i.project_uuid + inner join components p on p.uuid=i.component_uuid + inner join components root on root.uuid=i.project_uuid where (r.is_external is NULL or r.is_external = ${_false}) and i.component_uuid = #{componentUuid,jdbcType=VARCHAR} and @@ -219,9 +219,9 @@ from issues i inner join rules r on r.id = i.rule_id - inner join projects p on + inner join components p on p.uuid = i.component_uuid - inner join projects root on + inner join components root on root.uuid = i.project_uuid inner join issue_changes ic on ic.issue_key = i.kee @@ -241,7 +241,7 @@ select distinct(i.component_uuid) from issues i - inner join projects p on + inner join components p on p.uuid = i.component_uuid and p.enabled = ${_true} where @@ -261,8 +261,8 @@ <include refid="issueColumns"/> from issues i inner join rules r on r.id=i.rule_id - inner join projects p on p.uuid=i.component_uuid - inner join projects root on root.uuid=i.project_uuid + inner join components p on p.uuid=i.component_uuid + inner join components root on root.uuid=i.project_uuid where i.kee in <foreach collection="list" open="(" close=")" item="key" separator=","> #{key,jdbcType=VARCHAR} @@ -274,8 +274,8 @@ <include refid="issueColumns"/> from issues i inner join rules r on r.id=i.rule_id - inner join projects p on p.uuid=i.component_uuid - inner join projects root on root.uuid=i.project_uuid + inner join components p on p.uuid=i.component_uuid + inner join components root on root.uuid=i.project_uuid where i.kee in <foreach collection="keys" open="(" close=")" item="key" separator=","> @@ -311,8 +311,8 @@ <include refid="issueColumns"/> from issues i inner join rules r on r.id = i.rule_id - inner join projects p on p.uuid = i.component_uuid - inner join projects root on root.uuid = i.project_uuid + inner join components p on p.uuid = i.component_uuid + inner join components root on root.uuid = i.project_uuid where (r.is_external is NULL or r.is_external = ${_false}) and i.project_uuid = #{projectUuid, jdbcType=VARCHAR} and @@ -324,7 +324,7 @@ <select id="selectIssueGroupsByBaseComponent" resultType="org.sonar.db.issue.IssueGroupDto" parameterType="map"> select i.issue_type as ruleType, i.severity as severity, i.resolution as resolution, i.status as status, sum(i.effort) as effort, count(i.issue_type) as "count", (i.issue_creation_date >= #{leakPeriodBeginningDate,jdbcType=BIGINT}) as inLeak from issues i - inner join projects p on p.uuid = i.component_uuid and p.project_uuid = i.project_uuid + inner join components p on p.uuid = i.component_uuid and p.project_uuid = i.project_uuid where i.status !='CLOSED' and i.project_uuid = #{baseComponent.projectUuid,jdbcType=VARCHAR} and (p.uuid_path like #{baseComponent.uuidPathLikeIncludingSelf,jdbcType=VARCHAR} escape '/' or p.uuid = #{baseComponent.uuid,jdbcType=VARCHAR}) @@ -336,7 +336,7 @@ from ( select i.issue_type, i.severity, i.resolution, i.status, i.effort, case when i.issue_creation_date > #{leakPeriodBeginningDate,jdbcType=BIGINT} then 1 else 0 end as inLeak from issues i - inner join projects p on p.uuid = i.component_uuid and p.project_uuid = i.project_uuid + inner join components p on p.uuid = i.component_uuid and p.project_uuid = i.project_uuid where i.status !='CLOSED' and i.project_uuid = #{baseComponent.projectUuid,jdbcType=VARCHAR} and (p.uuid_path like #{baseComponent.uuidPathLikeIncludingSelf,jdbcType=VARCHAR} escape '/' or p.uuid = #{baseComponent.uuid,jdbcType=VARCHAR}) @@ -349,7 +349,7 @@ from ( select i.issue_type, i.severity, i.resolution, i.status, i.effort, case when i.issue_creation_date > #{leakPeriodBeginningDate,jdbcType=BIGINT} then 1 else 0 end as inLeak from issues i - inner join projects p on p.uuid = i.component_uuid and p.project_uuid = i.project_uuid + inner join components p on p.uuid = i.component_uuid and p.project_uuid = i.project_uuid where i.status !='CLOSED' and i.project_uuid = #{baseComponent.projectUuid,jdbcType=VARCHAR} and (p.uuid_path like #{baseComponent.uuidPathLikeIncludingSelf,jdbcType=VARCHAR} escape '/' or p.uuid = #{baseComponent.uuid,jdbcType=VARCHAR}) diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/LiveMeasureMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/LiveMeasureMapper.xml index 5f1238f9161..433ea26aff5 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/LiveMeasureMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/LiveMeasureMapper.xml @@ -47,7 +47,7 @@ select b.project_uuid as projectUuid, max(lm.value) as maxncloc from live_measures lm inner join metrics m on m.id = lm.metric_id - inner join projects p on p.uuid = lm.component_uuid + inner join components p on p.uuid = lm.component_uuid inner join project_branches b on b.uuid = p.uuid <where> m.name = #{ncloc, jdbcType=VARCHAR} @@ -169,8 +169,8 @@ <select id="selectTreeByQuery" parameterType="map" resultType="org.sonar.db.measure.LiveMeasureDto" fetchSize="${_scrollFetchSize}" resultSetType="FORWARD_ONLY"> select <include refid="columns"/> from live_measures lm - inner join projects p on p.uuid = lm.component_uuid - <!-- TODO do we really need another join on projects ? Using lm.project_uuid should be enough --> + inner join components p on p.uuid = lm.component_uuid + <!-- TODO do we really need another join on components ? Using lm.project_uuid should be enough --> <include refid="org.sonar.db.component.ComponentMapper.selectDescendantsJoins"/> <where> <if test="query.getMetricIds() != null"> @@ -196,7 +196,7 @@ -- Add measures of base component union all select <include refid="columns"/> from live_measures lm - inner join projects p on p.uuid = lm.component_uuid and lm.component_uuid = #{baseUuid, jdbcType=VARCHAR} + inner join components p on p.uuid = lm.component_uuid and lm.component_uuid = #{baseUuid, jdbcType=VARCHAR} <where> <if test="query.getMetricIds() != null"> lm.metric_id in diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/MeasureMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/MeasureMapper.xml index a5d4d313c7b..64c92258fdc 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/MeasureMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/MeasureMapper.xml @@ -64,7 +64,7 @@ <select id="selectByQueryOnSingleComponent" parameterType="map" resultType="Measure"> select <include refid="measureColumns"/> from project_measures pm <include refid="selectByQueryCommonJoins"/> - inner join projects p on p.project_uuid=analysis.component_uuid + inner join components p on p.project_uuid=analysis.component_uuid and p.uuid=pm.component_uuid where <include refid="selectByQueryCommonFilters"/> diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml index b23b1b46960..bffb4c01753 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml @@ -124,7 +124,7 @@ and exists( select 1 from snapshots s - inner join projects p on p.uuid = s.component_uuid + inner join components p on p.uuid = s.component_uuid where p.organization_uuid = org.uuid and p.enabled = ${_true} and s.islast = ${_true} @@ -134,7 +134,7 @@ and exists( select 1 from snapshots s - inner join projects p on p.uuid = s.component_uuid + inner join components p on p.uuid = s.component_uuid where p.organization_uuid = org.uuid and p.enabled = ${_true} and s.islast = ${_true} @@ -192,7 +192,7 @@ select b.project_uuid, p.organization_uuid as orgUuid, max(lm.value) as maxncloc from live_measures lm inner join metrics m on m.id = lm.metric_id - inner join projects p on p.uuid = lm.component_uuid + inner join components p on p.uuid = lm.component_uuid inner join project_branches b on b.uuid = p.uuid where m.name = #{ncloc, jdbcType=VARCHAR} diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/AuthorizationMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/AuthorizationMapper.xml index 56b60914ce3..987719d1afe 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/AuthorizationMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/AuthorizationMapper.xml @@ -206,7 +206,7 @@ p.id from user_roles ur - inner join projects p on + inner join components p on p.id = ur.resource_id where ur.role=#{role, jdbcType=VARCHAR} @@ -241,7 +241,7 @@ select p.id from - projects p + components p where <foreach collection="componentIds" open="(" close=")" item="element" index="index" separator=" or "> p.id=#{element ,jdbcType=BIGINT} @@ -252,7 +252,7 @@ <select id="keepAuthorizedProjectUuidsForUser" parameterType="map" resultType="String"> select p.uuid - from projects p + from components p inner join group_roles gr on p.id = gr.resource_id where gr.role = #{permission, jdbcType=VARCHAR} @@ -267,7 +267,7 @@ union select p.uuid - from projects p + from components p inner join user_roles ur on p.id = ur.resource_id where ur.role=#{permission, jdbcType=VARCHAR} @@ -278,7 +278,7 @@ union select p.uuid - from projects p + from components p where p.uuid in <foreach collection="projectUuids" open="(" close=")" item="projectUuid" index="index" separator=",">#{projectUuid, jdbcType=VARCHAR}</foreach> and p.private = ${_false} @@ -287,7 +287,7 @@ <select id="keepAuthorizedProjectUuidsForAnonymous" parameterType="map" resultType="String"> select p.uuid - from projects p + from components p inner join group_roles gr on p.id = gr.resource_id where gr.role=#{permission, jdbcType=VARCHAR} @@ -298,7 +298,7 @@ union select p.uuid - from projects p + from components p where p.uuid in <foreach collection="projectUuids" open="(" close=")" item="projectUuid" index="index" separator=",">#{projectUuid, jdbcType=VARCHAR}</foreach> and p.private = ${_false} @@ -349,7 +349,7 @@ select 1 from - projects p + components p where p.id =#{componentId, jdbcType=BIGINT} and p.private = ${_false} @@ -360,7 +360,7 @@ <select id="selectProjectPermissions" parameterType="map" resultType="String"> select ur.role from user_roles ur - inner join projects p on p.id = ur.resource_id + inner join components p on p.id = ur.resource_id where p.uuid = #{projectUuid, jdbcType=VARCHAR} and p.organization_uuid = ur.organization_uuid and @@ -371,7 +371,7 @@ select gr.role from group_roles gr inner join groups_users gu on gr.group_id = gu.group_id - inner join projects p on p.id = gr.resource_id + inner join components p on p.id = gr.resource_id where p.uuid = #{projectUuid, jdbcType=VARCHAR} and p.organization_uuid = gr.organization_uuid and @@ -391,7 +391,7 @@ gr.role from group_roles gr - inner join projects p on + inner join components p on p.id = gr.resource_id where p.uuid = #{projectUuid, jdbcType=VARCHAR} @@ -440,14 +440,14 @@ exists ( select 1 from user_roles ur - inner join projects p on p.id = ur.resource_id and p.organization_uuid = ur.organization_uuid + inner join components p on p.id = ur.resource_id and p.organization_uuid = ur.organization_uuid where p.kee = #{projectKey, jdbcType=VARCHAR} and ur.role = #{permission, jdbcType=VARCHAR} and ur.user_id = u.id ) or exists ( select 1 - from projects p + from components p inner join group_roles gr on gr.resource_id = p.id and gr.organization_uuid = p.organization_uuid inner join groups_users gu on gu.group_id = gr.group_id where @@ -458,7 +458,7 @@ <if test="permission == 'user' or permission == 'codeviewer'"> or exists ( select 1 - from projects p + from components p where p.kee = #{projectKey, jdbcType=VARCHAR} and p.private = ${_false} diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/GroupPermissionMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/GroupPermissionMapper.xml index 11cc02aca6c..dda0afa919e 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/GroupPermissionMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/GroupPermissionMapper.xml @@ -85,7 +85,7 @@ </where> ) sub - left join projects p on sub.componentId = p.id + left join components p on sub.componentId = p.id <where> <if test="query.searchQueryToSql != null"> and lower(sub.name) like #{query.searchQueryToSqlLowercase,jdbcType=VARCHAR} ESCAPE '/' diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/UserPermissionMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/UserPermissionMapper.xml index 71d6b929116..2df73ecf881 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/UserPermissionMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/permission/UserPermissionMapper.xml @@ -40,7 +40,7 @@ and ur.resource_id = #{query.componentId,jdbcType=BIGINT} </otherwise> </choose> - left join projects p on ur.resource_id = p.id + left join components p on ur.resource_id = p.id inner join organization_members om on u.id=om.user_id and om.organization_uuid=#{query.organizationUuid,jdbcType=VARCHAR} <where> <include refid="sqlQueryFilters" /> @@ -60,7 +60,7 @@ <sql id="sqlQueryJoins"> from users u left join user_roles ur on ur.user_id = u.id - left join projects p on ur.resource_id = p.id + left join components p on ur.resource_id = p.id inner join organization_members om on u.id=om.user_id and om.organization_uuid=#{query.organizationUuid,jdbcType=VARCHAR} </sql> @@ -109,7 +109,7 @@ select ur.resource_id as componentId, ur.role as permission, count(u.login) as count from users u inner join user_roles ur on ur.user_id = u.id - inner join projects p on p.id = ur.resource_id + inner join components p on p.id = ur.resource_id where u.active = ${_true} and p.id in <foreach collection="projectIds" open="(" close=")" item="projectId" separator=",">#{projectId}</foreach> group by ur.resource_id, ur.role diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/project/ProjectMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/project/ProjectMapper.xml new file mode 100644 index 00000000000..761d1f01e49 --- /dev/null +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/project/ProjectMapper.xml @@ -0,0 +1,144 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd"> +<mapper namespace="org.sonar.db.project.ProjectMapper"> + + <sql id="projectColumns"> + p.uuid as uuid, + p.organization_uuid as organizationUuid, + p.kee as kee, + p.qualifier as qualifier, + p.name as name, + p.description as description, + p.tags as tagsString, + p.private as isPrivate, + p.created_at as createdAt, + p.updated_at as updatedAt + </sql> + + <select id="selectByUuid" parameterType="String" resultType="Project"> + SELECT + <include refid="projectColumns"/> + FROM projects p + where + p.uuid=#{uuid,jdbcType=VARCHAR} + </select> + + <select id="selectByUuids" resultType="Project"> + select + <include refid="projectColumns"/> + from projects p + where + p.uuid in + <foreach collection="uuids" open="(" close=")" item="uuid" separator=","> + #{uuid,jdbcType=VARCHAR} + </foreach> + </select> + + <select id="selectProjectsByKeys" resultType="Project"> + select + <include refid="projectColumns"/> + from projects p + where + p.qualifier='TRK' and + p.kee in + <foreach collection="kees" open="(" close=")" item="k" separator=","> + #{k,jdbcType=VARCHAR} + </foreach> + </select> + + <select id="selectProjects" resultType="Project"> + select + <include refid="projectColumns"/> + from projects p + where + p.qualifier='TRK' + </select> + + <select id="selectByOrganizationUuid" parameterType="String" resultType="Project"> + select + <include refid="projectColumns"/> + from projects p + where + p.organization_uuid=#{organizationUuid,jdbcType=VARCHAR} + </select> + + <select id="selectProjectsByOrganizationUuid" parameterType="String" resultType="Project"> + select + <include refid="projectColumns"/> + from projects p + where + p.qualifier='TRK' and + p.organization_uuid=#{organizationUuid,jdbcType=VARCHAR} + </select> + + <select id="selectProjectByKey" parameterType="String" resultType="Project"> + SELECT + <include refid="projectColumns"/> + FROM projects p + where + p.qualifier='TRK' and + p.kee=#{key,jdbcType=VARCHAR} + </select> + + <select id="selectApplicationByKey" parameterType="String" resultType="Project"> + SELECT + <include refid="projectColumns"/> + FROM projects p + where + p.qualifier='APP' and + p.kee=#{key,jdbcType=VARCHAR} + </select> + + <select id="selectProjectOrAppByKey" parameterType="String" resultType="Project"> + SELECT + <include refid="projectColumns"/> + FROM projects p + where + p.kee=#{key,jdbcType=VARCHAR} + </select> + + <insert id="insert" parameterType="Project"> + INSERT INTO projects ( + organization_uuid, + kee, + qualifier, + uuid, + name, + description, + private, + tags, + created_at, + updated_at + ) + VALUES ( + #{organizationUuid,jdbcType=VARCHAR}, + #{kee,jdbcType=VARCHAR}, + #{qualifier,jdbcType=VARCHAR}, + #{uuid,jdbcType=VARCHAR}, + #{name,jdbcType=VARCHAR}, + #{description,jdbcType=VARCHAR}, + #{isPrivate,jdbcType=BOOLEAN}, + #{tagsString, jdbcType=VARCHAR}, + #{createdAt,jdbcType=BIGINT}, + #{updatedAt,jdbcType=BIGINT} + ) + </insert> + + <update id="updateTags" parameterType="Project"> + update projects set + tags = #{tagsString,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=BIGINT} + where + uuid = #{uuid,jdbcType=VARCHAR} + </update> + + <update id="update" parameterType="Project"> + update projects set + name = #{name,jdbcType=VARCHAR}, + description = #{description,jdbcType=VARCHAR}, + updated_at = #{updatedAt,jdbcType=BIGINT} + where + uuid = #{uuid,jdbcType=VARCHAR} + </update> + +</mapper> diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/property/InternalComponentPropertiesMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/property/InternalComponentPropertiesMapper.xml index 0a079a62524..bc11d47d539 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/property/InternalComponentPropertiesMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/property/InternalComponentPropertiesMapper.xml @@ -25,7 +25,7 @@ FROM internal_component_props icp JOIN - projects p + components p ON icp.component_uuid = p.uuid <where> diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml index 1af78ca7308..ac862b11999 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/property/PropertiesMapper.xml @@ -23,7 +23,7 @@ ${_false} as "global" FROM users u - INNER JOIN projects c on c.kee = #{projectKey,jdbcType=VARCHAR} + INNER JOIN components c on c.kee = #{projectKey,jdbcType=VARCHAR} INNER JOIN properties p ON p.user_id = u.id WHERE p.prop_key = #{notifKey,jdbcType=VARCHAR} @@ -59,7 +59,7 @@ u.email as "email" FROM users u - INNER JOIN projects c on + INNER JOIN components c on c.kee = #{projectKey,jdbcType=VARCHAR} INNER JOIN properties p ON p.user_id = u.id @@ -99,7 +99,7 @@ <include refid="columnsToScrapPropertyDto"/> from properties p, - projects r + components r where p.resource_id=r.id and p.user_id is null @@ -177,7 +177,7 @@ <include refid="columnsToScrapPropertyDto"/> from properties p - inner join projects prj on prj.id=p.resource_id and prj.qualifier = #{qualifier, jdbcType=VARCHAR} + inner join components prj on prj.id=p.resource_id and prj.qualifier = #{qualifier, jdbcType=VARCHAR} where p.prop_key = #{key, jdbcType=VARCHAR} and p.user_id = #{userId, jdbcType=INTEGER} @@ -204,7 +204,7 @@ <select id="selectIdsByOrganizationAndUser" parameterType="map" resultType="long"> select py.id from properties py - inner join projects ps on py.resource_id = ps.id + inner join components ps on py.resource_id = ps.id where py.user_id=#{userId,jdbcType=INTEGER} and ps.organization_uuid=#{organizationUuid,jdbcType=VARCHAR} @@ -213,7 +213,7 @@ <select id="selectIdsByOrganizationAndMatchingLogin" parameterType="String" resultType="long"> select py.id from properties py - inner join projects ps on py.resource_id = ps.id + inner join components ps on py.resource_id = ps.id where py.text_value like #{login,jdbcType=VARCHAR} and py.prop_key in diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml index add001d2975..2d1dffdcf62 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml @@ -66,7 +66,7 @@ select p.id, p.uuid from - projects p + components p where ( p.project_uuid=#{rootUuid,jdbcType=VARCHAR} @@ -82,7 +82,7 @@ select file_uuid from file_sources fs - inner join projects p on + inner join components p on p.uuid = fs.file_uuid and p.enabled = ${_false} and p.project_uuid=#{projectUuid,jdbcType=VARCHAR} @@ -92,7 +92,7 @@ select i.component_uuid from issues i - inner join projects p on + inner join components p on p.uuid = i.component_uuid and p.enabled = ${_false} and p.project_uuid=#{projectUuid,jdbcType=VARCHAR} @@ -104,7 +104,7 @@ select lm.component_uuid from live_measures lm - inner join projects p on + inner join components p on p.uuid = lm.component_uuid and p.enabled = ${_false} and p.project_uuid=#{projectUuid,jdbcType=VARCHAR} @@ -245,14 +245,20 @@ </delete> <delete id="deleteComponentsByProjectUuid" parameterType="map"> - delete from projects + delete from components where project_uuid = #{rootUuid,jdbcType=VARCHAR} </delete> - <delete id="deleteComponentsByUuids" parameterType="map"> + <delete id="deleteProjectsByProjectUuid" parameterType="map"> delete from projects where + uuid = #{projectUuid,jdbcType=VARCHAR} + </delete> + + <delete id="deleteComponentsByUuids" parameterType="map"> + delete from components + where uuid in <foreach collection="componentUuids" open="(" close=")" item="componentUuid" separator=","> #{componentUuid,jdbcType=VARCHAR} @@ -340,7 +346,7 @@ SELECT p.id, p.uuid FROM - projects p + components p WHERE p.enabled = ${_false} AND p.project_uuid=#{projectUuid,jdbcType=VARCHAR} diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.xml index e0ce3f079ff..d99aea3a41d 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.xml @@ -3,9 +3,9 @@ <mapper namespace="org.sonar.db.qualitygate.ProjectQgateAssociationMapper"> - <select id="selectProjects" parameterType="map" resultType="ProjectQgateAssociation"> +<select id="selectProjects" parameterType="map" resultType="ProjectQgateAssociation"> SELECT proj.id as id, proj.kee as "key", proj.name as name, qg.id as gateId - FROM projects proj + FROM components proj LEFT JOIN project_qgates prqg ON prqg.project_uuid=proj.uuid AND prqg.quality_gate_uuid = #{query.gateUuid, jdbcType=VARCHAR} LEFT JOIN quality_gates qg ON qg.uuid = prqg.quality_gate_uuid where @@ -28,11 +28,11 @@ order by proj.name </select> - <select id="selectQGateUuidByComponentUuid" parameterType="String" resultType="string"> + <select id="selectQGateUuidByProjectUuid" parameterType="String" resultType="string"> SELECT quality_gate_uuid FROM project_qgates <where> - AND project_uuid=#{componentUuid} + AND project_uuid=#{projectUuid} </where> </select> diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml index 5a74720b17a..a8c61196813 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml @@ -261,7 +261,7 @@ <select id="countProjectsByOrganizationAndProfiles" resultType="KeyLongValue" parameterType="map"> select pqp.profile_key as "key", count(pj.uuid) as "value" - from projects pj + from components pj inner join project_qprofiles pqp on pqp.project_uuid = pj.uuid inner join org_qprofiles oqp on oqp.uuid = pqp.profile_key where @@ -340,7 +340,7 @@ pj.kee as projectKey, pj.name as projectName, pp.profile_key as profileKey - from projects pj + from components pj inner join project_qprofiles pp ON pp.project_uuid = pj.uuid and pp.profile_key = #{profileUuid, jdbcType=VARCHAR} where pj.scope = 'PRJ' @@ -353,7 +353,7 @@ <select id="selectDeselectedProjects" resultType="org.sonar.db.qualityprofile.ProjectQprofileAssociationDto"> SELECT pp.id as id, pj.id as projectId, pj.uuid as projectUuid, pj.kee as projectKey, pj.name as projectName, pp.profile_key as profileKey - FROM projects pj + FROM components pj LEFT JOIN project_qprofiles pp ON pp.project_uuid = pj.uuid AND pp.profile_key = #{profileUuid, jdbcType=VARCHAR} WHERE pj.scope='PRJ' AND pj.qualifier='TRK' AND pj.main_branch_project_uuid is null @@ -365,7 +365,7 @@ <select id="selectProjectAssociations" resultType="org.sonar.db.qualityprofile.ProjectQprofileAssociationDto"> SELECT pp.id as id, pj.id as projectId, pj.uuid as projectUuid, pj.kee as projectKey, pj.name as projectName, pp.profile_key as profileKey - FROM projects pj + FROM components pj LEFT JOIN project_qprofiles pp ON pp.project_uuid = pj.uuid AND pp.profile_key = #{profileUuid, jdbcType=VARCHAR} WHERE pj.scope='PRJ' AND pj.qualifier='TRK' AND pj.main_branch_project_uuid is null diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml index 7e017a68b8f..3a8658f30aa 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/source/FileSourceMapper.xml @@ -43,7 +43,7 @@ p.uuid as uuid, p.path as path, fs.line_hashes as rawLineHashes - from projects p + from components p inner join file_sources fs on fs.file_uuid = p.uuid where diff --git a/server/sonar-db-dao/src/schema/schema-sq.ddl b/server/sonar-db-dao/src/schema/schema-sq.ddl index 4939a434a27..16d5ae1174a 100644 --- a/server/sonar-db-dao/src/schema/schema-sq.ddl +++ b/server/sonar-db-dao/src/schema/schema-sq.ddl @@ -163,6 +163,54 @@ CREATE TABLE "CE_TASK_MESSAGE"( ALTER TABLE "CE_TASK_MESSAGE" ADD CONSTRAINT "PK_CE_TASK_MESSAGE" PRIMARY KEY("UUID"); CREATE INDEX "CE_TASK_MESSAGE_TASK" ON "CE_TASK_MESSAGE"("TASK_UUID"); +CREATE TABLE "COMPONENTS"( + "ID" INTEGER NOT NULL AUTO_INCREMENT (1,1), + "UUID" VARCHAR(50) NOT NULL, + "ORGANIZATION_UUID" VARCHAR(40) NOT NULL, + "KEE" VARCHAR(400), + "DEPRECATED_KEE" VARCHAR(400), + "NAME" VARCHAR(2000), + "LONG_NAME" VARCHAR(2000), + "DESCRIPTION" VARCHAR(2000), + "ENABLED" BOOLEAN DEFAULT TRUE NOT NULL, + "SCOPE" VARCHAR(3), + "QUALIFIER" VARCHAR(10), + "PRIVATE" BOOLEAN NOT NULL, + "ROOT_UUID" VARCHAR(50) NOT NULL, + "LANGUAGE" VARCHAR(20), + "COPY_COMPONENT_UUID" VARCHAR(50), + "DEVELOPER_UUID" VARCHAR(50), + "PATH" VARCHAR(2000), + "UUID_PATH" VARCHAR(1500) NOT NULL, + "PROJECT_UUID" VARCHAR(50) NOT NULL, + "MODULE_UUID" VARCHAR(50), + "MODULE_UUID_PATH" VARCHAR(1500), + "AUTHORIZATION_UPDATED_AT" BIGINT, + "TAGS" VARCHAR(500), + "MAIN_BRANCH_PROJECT_UUID" VARCHAR(50), + "B_CHANGED" BOOLEAN, + "B_NAME" VARCHAR(500), + "B_LONG_NAME" VARCHAR(500), + "B_DESCRIPTION" VARCHAR(2000), + "B_ENABLED" BOOLEAN, + "B_QUALIFIER" VARCHAR(10), + "B_LANGUAGE" VARCHAR(20), + "B_COPY_COMPONENT_UUID" VARCHAR(50), + "B_PATH" VARCHAR(2000), + "B_UUID_PATH" VARCHAR(1500), + "B_MODULE_UUID" VARCHAR(50), + "B_MODULE_UUID_PATH" VARCHAR(1500), + "CREATED_AT" TIMESTAMP +); +ALTER TABLE "COMPONENTS" ADD CONSTRAINT "PK_PROJECTS" PRIMARY KEY("ID"); +CREATE INDEX "PROJECTS_ORGANIZATION" ON "COMPONENTS"("ORGANIZATION_UUID"); +CREATE UNIQUE INDEX "PROJECTS_KEE" ON "COMPONENTS"("KEE"); +CREATE INDEX "PROJECTS_MODULE_UUID" ON "COMPONENTS"("MODULE_UUID"); +CREATE INDEX "PROJECTS_PROJECT_UUID" ON "COMPONENTS"("PROJECT_UUID"); +CREATE INDEX "PROJECTS_QUALIFIER" ON "COMPONENTS"("QUALIFIER"); +CREATE INDEX "PROJECTS_ROOT_UUID" ON "COMPONENTS"("ROOT_UUID"); +CREATE INDEX "PROJECTS_UUID" ON "COMPONENTS"("UUID"); + CREATE TABLE "DEFAULT_QPROFILES"( "ORGANIZATION_UUID" VARCHAR(40) NOT NULL, "LANGUAGE" VARCHAR(20) NOT NULL, @@ -658,52 +706,20 @@ ALTER TABLE "PROJECT_QPROFILES" ADD CONSTRAINT "PK_PROJECT_QPROFILES" PRIMARY KE CREATE UNIQUE INDEX "UNIQ_PROJECT_QPROFILES" ON "PROJECT_QPROFILES"("PROJECT_UUID", "PROFILE_KEY"); CREATE TABLE "PROJECTS"( - "ID" INTEGER NOT NULL AUTO_INCREMENT (1,1), - "UUID" VARCHAR(50) NOT NULL, + "UUID" VARCHAR(40) NOT NULL, + "KEE" VARCHAR(400) NOT NULL, + "QUALIFIER" VARCHAR(10) NOT NULL, "ORGANIZATION_UUID" VARCHAR(40) NOT NULL, - "KEE" VARCHAR(400), - "DEPRECATED_KEE" VARCHAR(400), "NAME" VARCHAR(2000), - "LONG_NAME" VARCHAR(2000), "DESCRIPTION" VARCHAR(2000), - "ENABLED" BOOLEAN DEFAULT TRUE NOT NULL, - "SCOPE" VARCHAR(3), - "QUALIFIER" VARCHAR(10), "PRIVATE" BOOLEAN NOT NULL, - "ROOT_UUID" VARCHAR(50) NOT NULL, - "LANGUAGE" VARCHAR(20), - "COPY_COMPONENT_UUID" VARCHAR(50), - "DEVELOPER_UUID" VARCHAR(50), - "PATH" VARCHAR(2000), - "UUID_PATH" VARCHAR(1500) NOT NULL, - "PROJECT_UUID" VARCHAR(50) NOT NULL, - "MODULE_UUID" VARCHAR(50), - "MODULE_UUID_PATH" VARCHAR(1500), - "AUTHORIZATION_UPDATED_AT" BIGINT, "TAGS" VARCHAR(500), - "MAIN_BRANCH_PROJECT_UUID" VARCHAR(50), - "B_CHANGED" BOOLEAN, - "B_NAME" VARCHAR(500), - "B_LONG_NAME" VARCHAR(500), - "B_DESCRIPTION" VARCHAR(2000), - "B_ENABLED" BOOLEAN, - "B_QUALIFIER" VARCHAR(10), - "B_LANGUAGE" VARCHAR(20), - "B_COPY_COMPONENT_UUID" VARCHAR(50), - "B_PATH" VARCHAR(2000), - "B_UUID_PATH" VARCHAR(1500), - "B_MODULE_UUID" VARCHAR(50), - "B_MODULE_UUID_PATH" VARCHAR(1500), - "CREATED_AT" TIMESTAMP + "CREATED_AT" BIGINT NOT NULL, + "UPDATED_AT" BIGINT NOT NULL ); -ALTER TABLE "PROJECTS" ADD CONSTRAINT "PK_PROJECTS" PRIMARY KEY("ID"); -CREATE INDEX "PROJECTS_ORGANIZATION" ON "PROJECTS"("ORGANIZATION_UUID"); -CREATE UNIQUE INDEX "PROJECTS_KEE" ON "PROJECTS"("KEE"); -CREATE INDEX "PROJECTS_MODULE_UUID" ON "PROJECTS"("MODULE_UUID"); -CREATE INDEX "PROJECTS_PROJECT_UUID" ON "PROJECTS"("PROJECT_UUID"); -CREATE INDEX "PROJECTS_QUALIFIER" ON "PROJECTS"("QUALIFIER"); -CREATE INDEX "PROJECTS_ROOT_UUID" ON "PROJECTS"("ROOT_UUID"); -CREATE INDEX "PROJECTS_UUID" ON "PROJECTS"("UUID"); +ALTER TABLE "PROJECTS" ADD CONSTRAINT "PK_NEW_PROJECTS" PRIMARY KEY("UUID"); +CREATE UNIQUE INDEX "UNIQ_PROJECTS_KEE" ON "PROJECTS"("KEE"); +CREATE INDEX "IDX_QUALIFIER" ON "PROJECTS"("QUALIFIER"); CREATE TABLE "PROPERTIES"( "ID" INTEGER NOT NULL AUTO_INCREMENT (1,1), diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/DaoModuleTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/DaoModuleTest.java index c3e28196565..20f8df29878 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/DaoModuleTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/DaoModuleTest.java @@ -30,6 +30,6 @@ public class DaoModuleTest { public void verify_count_of_added_components() { ComponentContainer container = new ComponentContainer(); new DaoModule().configure(container); - assertThat(container.size()).isEqualTo(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 65); + assertThat(container.size()).isEqualTo(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 66); } } diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/setting/ProjectAlmSettingDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/setting/ProjectAlmSettingDaoTest.java index 09a8f576b5d..474ac89f68f 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/setting/ProjectAlmSettingDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/setting/ProjectAlmSettingDaoTest.java @@ -26,7 +26,7 @@ import org.sonar.api.utils.System2; import org.sonar.core.util.UuidFactory; import org.sonar.db.DbSession; import org.sonar.db.DbTester; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -54,8 +54,8 @@ public class ProjectAlmSettingDaoTest { when(uuidFactory.create()).thenReturn(A_UUID); when(system2.now()).thenReturn(A_DATE); AlmSettingDto githubAlmSettingDto = db.almSettings().insertGitHubAlmSetting(); - ComponentDto project = db.components().insertPrivateProject(); - ComponentDto anotherProject = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); + ProjectDto anotherProject = db.components().insertPrivateProjectDto(); ProjectAlmSettingDto githubProjectAlmSettingDto = newGithubProjectAlmSettingDto(githubAlmSettingDto, project); underTest.insertOrUpdate(dbSession, githubProjectAlmSettingDto); @@ -63,7 +63,7 @@ public class ProjectAlmSettingDaoTest { .extracting(ProjectAlmSettingDto::getUuid, ProjectAlmSettingDto::getAlmSettingUuid, ProjectAlmSettingDto::getProjectUuid, ProjectAlmSettingDto::getAlmRepo, ProjectAlmSettingDto::getAlmSlug, ProjectAlmSettingDto::getCreatedAt, ProjectAlmSettingDto::getUpdatedAt) - .containsExactly(A_UUID, githubAlmSettingDto.getUuid(), project.uuid(), + .containsExactly(A_UUID, githubAlmSettingDto.getUuid(), project.getUuid(), githubProjectAlmSettingDto.getAlmRepo(), githubProjectAlmSettingDto.getAlmSlug(), A_DATE, A_DATE); @@ -75,7 +75,7 @@ public class ProjectAlmSettingDaoTest { when(uuidFactory.create()).thenReturn(A_UUID); when(system2.now()).thenReturn(A_DATE); AlmSettingDto githubAlmSetting = db.almSettings().insertGitHubAlmSetting(); - ComponentDto project = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); ProjectAlmSettingDto projectAlmSettingDto = db.almSettings().insertGitHubProjectAlmSetting(githubAlmSetting, project); AlmSettingDto anotherGithubAlmSetting = db.almSettings().insertGitHubAlmSetting(); @@ -87,7 +87,7 @@ public class ProjectAlmSettingDaoTest { .extracting(ProjectAlmSettingDto::getUuid, ProjectAlmSettingDto::getAlmSettingUuid, ProjectAlmSettingDto::getProjectUuid, ProjectAlmSettingDto::getAlmRepo, ProjectAlmSettingDto::getAlmSlug, ProjectAlmSettingDto::getCreatedAt, ProjectAlmSettingDto::getUpdatedAt) - .containsExactly(projectAlmSettingDto.getUuid(), anotherGithubAlmSetting.getUuid(), project.uuid(), + .containsExactly(projectAlmSettingDto.getUuid(), anotherGithubAlmSetting.getUuid(), project.getUuid(), newProjectAlmSettingDto.getAlmRepo(), newProjectAlmSettingDto.getAlmSlug(), A_DATE, A_DATE_LATER); } @@ -97,9 +97,9 @@ public class ProjectAlmSettingDaoTest { when(uuidFactory.create()).thenReturn(A_UUID); when(system2.now()).thenReturn(A_DATE); AlmSettingDto githubAlmSetting = db.almSettings().insertGitHubAlmSetting(); - ComponentDto project = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); db.almSettings().insertGitHubProjectAlmSetting(githubAlmSetting, project); - ComponentDto anotherProject = db.components().insertPrivateProject(); + ProjectDto anotherProject = db.components().insertPrivateProjectDto(); db.almSettings().insertGitHubProjectAlmSetting(githubAlmSetting, anotherProject); underTest.deleteByProject(dbSession, project); @@ -113,13 +113,13 @@ public class ProjectAlmSettingDaoTest { when(uuidFactory.create()).thenReturn(A_UUID); when(system2.now()).thenReturn(A_DATE); AlmSettingDto githubAlmSetting = db.almSettings().insertGitHubAlmSetting(); - ComponentDto project1 = db.components().insertPrivateProject(); - ComponentDto project2 = db.components().insertPrivateProject(); + ProjectDto project1 = db.components().insertPrivateProjectDto(); + ProjectDto project2 = db.components().insertPrivateProjectDto(); db.almSettings().insertGitHubProjectAlmSetting(githubAlmSetting, project1); db.almSettings().insertGitHubProjectAlmSetting(githubAlmSetting, project2); AlmSettingDto githubAlmSetting1 = db.almSettings().insertGitHubAlmSetting(); - ComponentDto anotherProject = db.components().insertPrivateProject(); + ProjectDto anotherProject = db.components().insertPrivateProjectDto(); db.almSettings().insertGitHubProjectAlmSetting(githubAlmSetting1, anotherProject); underTest.deleteByAlmSetting(dbSession, githubAlmSetting); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/component/BranchDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/component/BranchDaoTest.java index 593a10efa5a..6ff008db3bd 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/component/BranchDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/component/BranchDaoTest.java @@ -22,6 +22,8 @@ package org.sonar.db.component; import com.tngtech.java.junit.dataprovider.DataProvider; import com.tngtech.java.junit.dataprovider.DataProviderRunner; import java.util.Collection; +import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.annotation.Nullable; import org.junit.Rule; @@ -31,6 +33,7 @@ import org.sonar.api.impl.utils.TestSystem2; import org.sonar.api.utils.System2; import org.sonar.db.DbSession; import org.sonar.db.DbTester; +import org.sonar.db.project.ProjectDto; import org.sonar.db.protobuf.DbProjectBranches; import static java.util.Arrays.asList; @@ -377,6 +380,26 @@ public class BranchDaoTest { } @Test + public void selectByBranchKeys() { + ProjectDto project1 = db.components().insertPrivateProjectDto(); + ProjectDto project2 = db.components().insertPrivateProjectDto(); + ProjectDto project3 = db.components().insertPrivateProjectDto(); + + BranchDto branch1 = db.components().insertProjectBranch(project1, b -> b.setKey("branch1")); + BranchDto branch2 = db.components().insertProjectBranch(project2, b -> b.setKey("branch2")); + BranchDto branch3 = db.components().insertProjectBranch(project3, b -> b.setKey("branch3")); + + Map<String, String> branchKeysByProjectUuid = new HashMap<>(); + branchKeysByProjectUuid.put(project1.getUuid(), "branch1"); + branchKeysByProjectUuid.put(project2.getUuid(), "branch2"); + branchKeysByProjectUuid.put(project3.getUuid(), "nonexisting"); + + List<BranchDto> branchDtos = underTest.selectByBranchKeys(dbSession, branchKeysByProjectUuid); + assertThat(branchDtos).hasSize(2); + assertThat(branchDtos).extracting(BranchDto::getUuid).containsExactlyInAnyOrder(branch1.getUuid(), branch2.getUuid()); + } + + @Test public void selectByComponent() { BranchDto mainBranch = new BranchDto(); mainBranch.setProjectUuid("U1"); @@ -452,6 +475,24 @@ public class BranchDaoTest { } @Test + public void selectByProjectUuid() { + ComponentDto project1 = db.components().insertPrivateProject(); + ComponentDto project2 = db.components().insertPrivateProject(); + + ComponentDto branch1 = db.components().insertProjectBranch(project1); + ComponentDto branch2 = db.components().insertProjectBranch(project1); + ComponentDto branch3 = db.components().insertProjectBranch(project2); + ComponentDto branch4 = db.components().insertProjectBranch(project2); + + assertThat(underTest.selectByProject(dbSession, new ProjectDto().setUuid(project1.uuid()))) + .extracting(BranchDto::getUuid) + .containsExactlyInAnyOrder(project1.uuid(), branch1.uuid(), branch2.uuid()); + assertThat(underTest.selectByProject(dbSession, new ProjectDto().setUuid(project2.uuid()))) + .extracting(BranchDto::getUuid) + .containsExactlyInAnyOrder(project2.uuid(), branch3.uuid(), branch4.uuid()); + } + + @Test public void selectByUuid() { ComponentDto project = db.components().insertPrivateProject(); ComponentDto branch1 = db.components().insertProjectBranch(project); @@ -460,7 +501,7 @@ public class BranchDaoTest { assertThat(underTest.selectByUuid(db.getSession(), branch1.uuid()).get()) .extracting(BranchDto::getUuid) .isEqualTo(branch1.uuid()); - assertThat(underTest.selectByUuid(db.getSession(), project.uuid())).isNotPresent(); + assertThat(underTest.selectByUuid(db.getSession(), project.uuid())).isPresent(); assertThat(underTest.selectByUuid(db.getSession(), "unknown")).isNotPresent(); } @@ -485,8 +526,8 @@ public class BranchDaoTest { ComponentDto branch1 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)); ComponentDto branch2 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)); ComponentDto pr = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST)); - assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.BRANCH, 0L)).isEqualTo(2); - assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.BRANCH, NOW)).isEqualTo(2); + assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.BRANCH, 0L)).isEqualTo(3); + assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.BRANCH, NOW)).isEqualTo(3); assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.BRANCH, NOW + 100)).isEqualTo(0); assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.PULL_REQUEST, 0L)).isEqualTo(1); assertThat(underTest.countByTypeAndCreationDate(dbSession, BranchType.PULL_REQUEST, NOW)).isEqualTo(1); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java index 62177d2dc07..dc4e353c7b0 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java @@ -220,7 +220,7 @@ public class ComponentDaoTest { @Test public void selectByKeyAndBranch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("my_branch").setBranchType(BRANCH)); ComponentDto file = db.components().insertComponent(newFileDto(branch)); @@ -233,7 +233,7 @@ public class ComponentDaoTest { @Test public void selectByKeyAndPullRequest() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("my_branch")); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setKey("my_PR").setBranchType(PULL_REQUEST)); ComponentDto pullRequestNamedAsMainBranch = db.components().insertProjectBranch(project, b -> b.setKey("master").setBranchType(PULL_REQUEST)); @@ -299,7 +299,7 @@ public class ComponentDaoTest { @Test public void selectByKeysAndBranch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("my_branch")); ComponentDto file1 = db.components().insertComponent(newFileDto(branch)); ComponentDto file2 = db.components().insertComponent(newFileDto(branch)); @@ -318,9 +318,9 @@ public class ComponentDaoTest { @Test public void select_by_keys_and_branches() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto projectBranch = db.components().insertProjectBranch(project, b -> b.setKey("my_branch")); - ComponentDto application = db.components().insertMainBranch(a -> a.setQualifier(APP)); + ComponentDto application = db.components().insertPublicProject(a -> a.setQualifier(APP)); ComponentDto applicationBranch = db.components().insertProjectBranch(application, b -> b.setKey("my_branch")); assertThat(underTest.selectByKeysAndBranches(db.getSession(), ImmutableMap.of( @@ -1059,7 +1059,7 @@ public class ComponentDaoTest { @Test public void select_projects_does_not_return_branches() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); assertThat(underTest.selectProjects(dbSession)) @@ -1089,7 +1089,7 @@ public class ComponentDaoTest { @Test public void select_projects_by_organization_does_not_return_branches() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); ComponentDto branch = db.components().insertProjectBranch(project); assertThat(underTest.selectProjectsByOrganization(dbSession, organization.getUuid())) @@ -1153,7 +1153,7 @@ public class ComponentDaoTest { // the project does not have any analysis OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); assertThat(underTest.selectByQuery(dbSession, organization.getUuid(), query.get().build(), 0, 10)) .extracting(ComponentDto::uuid) .containsOnly(project.uuid()); @@ -1396,7 +1396,7 @@ public class ComponentDaoTest { "b_enabled as \"bEnabled\", b_uuid_path as \"bUuidPath\", b_language as \"bLanguage\", b_long_name as \"bLongName\"," + "b_module_uuid as \"bModuleUuid\", b_module_uuid_path as \"bModuleUuidPath\", b_name as \"bName\", " + "b_path as \"bPath\", b_qualifier as \"bQualifier\" " + - "from projects where uuid='" + uuid + "'"); + "from components where uuid='" + uuid + "'"); } @Test @@ -1507,7 +1507,7 @@ public class ComponentDaoTest { @Test public void selectByQuery_should_not_return_branches() { - ComponentDto main = db.components().insertMainBranch(); + ComponentDto main = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(main); assertThat(underTest.selectByQuery(dbSession, ALL_PROJECTS_COMPONENT_QUERY, 0, 2)).hasSize(1); @@ -1516,7 +1516,7 @@ public class ComponentDaoTest { @Test public void countByQuery_should_not_include_branches() { - ComponentDto main = db.components().insertMainBranch(); + ComponentDto main = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(main); assertThat(underTest.countByQuery(dbSession, ALL_PROJECTS_COMPONENT_QUERY)).isEqualTo(1); @@ -1616,12 +1616,12 @@ public class ComponentDaoTest { long aLongTimeAgo = 1_000_000_000L; long recentTime = 3_000_000_000L; // project with only a non-main and old analyzed branch - ComponentDto oldProject = db.components().insertMainBranch(); + ComponentDto oldProject = db.components().insertPublicProject(); ComponentDto oldProjectBranch = db.components().insertProjectBranch(oldProject, newBranchDto(oldProject).setBranchType(BRANCH)); db.components().insertSnapshot(oldProjectBranch, s -> s.setLast(true).setCreatedAt(aLongTimeAgo)); // project with only a old main branch and a recent non-main branch - ComponentDto recentProject = db.components().insertMainBranch(); + ComponentDto recentProject = db.components().insertPublicProject(); ComponentDto recentProjectBranch = db.components().insertProjectBranch(recentProject, newBranchDto(recentProject).setBranchType(BRANCH)); db.components().insertSnapshot(recentProjectBranch, s -> s.setCreatedAt(recentTime).setLast(true)); db.components().insertSnapshot(recentProjectBranch, s -> s.setCreatedAt(aLongTimeAgo).setLast(false)); @@ -1966,20 +1966,20 @@ public class ComponentDaoTest { OrganizationDto organizationDto = db.organizations().insert(); // project1, not the biggest branch - not returned - final ComponentDto project1 = db.components().insertMainBranch(organizationDto, b -> b.setName("foo")); + final ComponentDto project1 = db.components().insertPrivateProject(organizationDto, b -> b.setName("foo")); insertMeasure(20d, project1, metric); // branch of project1 - returned insertMeasure(30d, db.components().insertProjectBranch(project1, b -> b.setBranchType(BRANCH)), metric); // project2 - returned - insertMeasure(10d, db.components().insertMainBranch(organizationDto, b -> b.setName("bar")), metric); + insertMeasure(10d, db.components().insertPrivateProject(organizationDto, b -> b.setName("bar")), metric); // public project - not returned - insertMeasure(11d, db.components().insertMainBranch(organizationDto, b -> b.setPrivate(false)), metric); + insertMeasure(11d, db.components().insertPublicProject(organizationDto, b -> b.setPrivate(false)), metric); // different org - not returned - insertMeasure(12d, db.components().insertMainBranch(db.organizations().insert()), metric); + insertMeasure(12d, db.components().insertPrivateProject(db.organizations().insert()), metric); List<ProjectNclocDistributionDto> result = underTest.selectPrivateProjectsWithNcloc(db.getSession(), organizationDto.getUuid()); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentKeyUpdaterDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentKeyUpdaterDaoTest.java index df714521170..085f07a8139 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentKeyUpdaterDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentKeyUpdaterDaoTest.java @@ -20,6 +20,7 @@ package org.sonar.db.component; import com.google.common.base.Strings; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -63,7 +64,7 @@ public class ComponentKeyUpdaterDaoTest { underTest.updateKey(dbSession, "B", "struts:core"); dbSession.commit(); - assertThat(db.select("select uuid as \"UUID\", kee as \"KEE\" from projects")) + assertThat(db.select("select uuid as \"UUID\", kee as \"KEE\" from components")) .extracting(t -> t.get("UUID"), t -> t.get("KEE")) .containsOnly( Tuple.tuple("A", "org.struts:struts"), @@ -101,7 +102,7 @@ public class ComponentKeyUpdaterDaoTest { @Test public void updateKey_updates_branches_too() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); db.components().insertComponent(newFileDto(branch)); db.components().insertComponent(newFileDto(branch)); @@ -122,13 +123,13 @@ public class ComponentKeyUpdaterDaoTest { assertThat(dbClient.componentDao().selectAllComponentsFromProjectKey(dbSession, newProjectKey)).hasSize(1); assertThat(dbClient.componentDao().selectAllComponentsFromProjectKey(dbSession, newBranchKey)).hasSize(branchComponentCount); - db.select(dbSession, "select kee from projects") + db.select(dbSession, "select kee from components") .forEach(map -> map.values().forEach(k -> assertThat(k.toString()).startsWith(newProjectKey))); } @Test public void updateKey_updates_pull_requests_too() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setBranchType(PULL_REQUEST)); db.components().insertComponent(newFileDto(pullRequest)); db.components().insertComponent(newFileDto(pullRequest)); @@ -149,13 +150,13 @@ public class ComponentKeyUpdaterDaoTest { assertThat(dbClient.componentDao().selectAllComponentsFromProjectKey(dbSession, newProjectKey)).hasSize(1); assertThat(dbClient.componentDao().selectAllComponentsFromProjectKey(dbSession, newBranchKey)).hasSize(branchComponentCount); - db.select(dbSession, "select kee from projects") + db.select(dbSession, "select kee from components") .forEach(map -> map.values().forEach(k -> assertThat(k.toString()).startsWith(newProjectKey))); } @Test public void bulk_updateKey_updates_branches_too() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto module = db.components().insertComponent(prefixDbKeyWithKey(newModuleDto(branch), project.getKey())); ComponentDto file1 = db.components().insertComponent(prefixDbKeyWithKey(newFileDto(module), module.getKey())); @@ -177,7 +178,7 @@ public class ComponentKeyUpdaterDaoTest { assertThat(dbClient.componentDao().selectAllComponentsFromProjectKey(dbSession, newProjectKey)).hasSize(1); String newBranchKey = ComponentDto.generateBranchKey(newProjectKey, branch.getBranch()); assertThat(dbClient.componentDao().selectAllComponentsFromProjectKey(dbSession, newBranchKey)).hasSize(branchComponentCount); - db.select(dbSession, "select kee from projects") + db.select(dbSession, "select kee from components") .forEach(map -> map.values().forEach(k -> assertThat(k.toString()).startsWith(newProjectKey))); assertThat(rekeyedResources) @@ -193,7 +194,7 @@ public class ComponentKeyUpdaterDaoTest { @Test public void bulk_updateKey_on_branch_containing_slash() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("branch/with/slash")); String newKey = "newKey"; @@ -205,7 +206,7 @@ public class ComponentKeyUpdaterDaoTest { @Test public void bulk_updateKey_updates_pull_requests_too() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setBranchType(PULL_REQUEST)); ComponentDto module = db.components().insertComponent(prefixDbKeyWithKey(newModuleDto(pullRequest), project.getKey())); ComponentDto file1 = db.components().insertComponent(prefixDbKeyWithKey(newFileDto(module), module.getKey())); @@ -227,7 +228,7 @@ public class ComponentKeyUpdaterDaoTest { assertThat(dbClient.componentDao().selectAllComponentsFromProjectKey(dbSession, newProjectKey)).hasSize(1); assertThat(dbClient.componentDao().selectAllComponentsFromProjectKey(dbSession, newPullRequestKey)).hasSize(branchComponentCount); - db.select(dbSession, "select kee from projects") + db.select(dbSession, "select kee from components") .forEach(map -> map.values().forEach(k -> assertThat(k.toString()).startsWith(newProjectKey))); assertThat(rekeyedResources) @@ -277,7 +278,7 @@ public class ComponentKeyUpdaterDaoTest { underTest.bulkUpdateKey(dbSession, "A", "org.struts", "org.apache.struts", doNotReturnAnyRekeyedResource()); dbSession.commit(); - assertThat(db.select("select uuid as \"UUID\", kee as \"KEE\" from projects")) + assertThat(db.select("select uuid as \"UUID\", kee as \"KEE\" from components")) .extracting(t -> t.get("UUID"), t -> t.get("KEE")) .containsOnly( Tuple.tuple("A", "org.apache.struts:struts"), @@ -297,7 +298,7 @@ public class ComponentKeyUpdaterDaoTest { underTest.bulkUpdateKey(dbSession, "A", "struts-ui", "struts-web", doNotReturnAnyRekeyedResource()); dbSession.commit(); - assertThat(db.select("select uuid as \"UUID\", kee as \"KEE\" from projects")) + assertThat(db.select("select uuid as \"UUID\", kee as \"KEE\" from components")) .extracting(t -> t.get("UUID"), t -> t.get("KEE")) .containsOnly( Tuple.tuple("A", "org.struts:struts"), @@ -336,7 +337,7 @@ public class ComponentKeyUpdaterDaoTest { underTest.bulkUpdateKey(dbSession, "A", "org.struts", "org.apache.struts", doNotReturnAnyRekeyedResource()); dbSession.commit(); - assertThat(db.select("select uuid as \"UUID\", kee as \"KEE\" from projects")) + assertThat(db.select("select uuid as \"UUID\", kee as \"KEE\" from components")) .extracting(t -> t.get("UUID"), t -> t.get("KEE")) .containsOnly( Tuple.tuple("A", "org.apache.struts:struts"), diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/component/SnapshotDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/component/SnapshotDaoTest.java index 915d14a8d22..13510666665 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/component/SnapshotDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/component/SnapshotDaoTest.java @@ -280,9 +280,9 @@ public class SnapshotDaoTest { public void selectFinishedByComponentUuidsAndFromDates() { long from = 1_500_000_000_000L; long otherFrom = 1_200_000_000_000L; - ComponentDto firstProject = db.components().insertMainBranch(); - ComponentDto secondProject = db.components().insertMainBranch(); - ComponentDto thirdProject = db.components().insertMainBranch(); + ComponentDto firstProject = db.components().insertPublicProject(); + ComponentDto secondProject = db.components().insertPublicProject(); + ComponentDto thirdProject = db.components().insertPublicProject(); SnapshotDto finishedAnalysis = db.components().insertSnapshot(firstProject, s -> s.setStatus(STATUS_PROCESSED).setCreatedAt(from)); insertActivity(firstProject.uuid(), finishedAnalysis, SUCCESS); SnapshotDto otherFinishedAnalysis = db.components().insertSnapshot(firstProject, s -> s.setStatus(STATUS_PROCESSED).setCreatedAt(from + 1_000_000L)); @@ -305,7 +305,7 @@ public class SnapshotDaoTest { @Test public void selectFinishedByComponentUuidsAndFromDates_returns_processed_analysis_even_if_analysis_failed() { long from = 1_500_000_000_000L; - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); SnapshotDto unprocessedAnalysis = db.components().insertSnapshot(project, s -> s.setStatus(STATUS_UNPROCESSED).setCreatedAt(from + 1_000_000L)); insertActivity(project.uuid(), unprocessedAnalysis, CANCELED); SnapshotDto finishedAnalysis = db.components().insertSnapshot(project, s -> s.setStatus(STATUS_PROCESSED).setCreatedAt(from)); @@ -322,7 +322,7 @@ public class SnapshotDaoTest { @Test public void selectFinishedByComponentUuidsAndFromDates_return_branches_analysis() { long from = 1_500_000_000_000L; - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto firstBranch = db.components().insertProjectBranch(project); ComponentDto secondBranch = db.components().insertProjectBranch(project); SnapshotDto finishedAnalysis = db.components().insertSnapshot(firstBranch, s -> s.setStatus(STATUS_PROCESSED).setCreatedAt(from)); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java index 8d661bed97b..04bf2a024f0 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java @@ -193,7 +193,7 @@ public class IssueDaoTest { @Test public void selectOpenByComponentUuid() { RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto projectBranch = db.components().insertProjectBranch(project, b -> b.setKey("feature/foo") .setBranchType(BranchType.BRANCH)); @@ -215,7 +215,7 @@ public class IssueDaoTest { @Test public void selectOpenByComponentUuid_should_correctly_map_required_fields() { RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto projectBranch = db.components().insertProjectBranch(project, b -> b.setKey("feature/foo") .setBranchType(BranchType.BRANCH)); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/measure/LiveMeasureDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/measure/LiveMeasureDaoTest.java index 9654923a561..68249a2595e 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/measure/LiveMeasureDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/measure/LiveMeasureDaoTest.java @@ -274,15 +274,15 @@ public class LiveMeasureDaoTest { MetricDto ncloc = db.measures().insertMetric(m -> m.setKey("ncloc").setValueType(INT.toString())); MetricDto lines = db.measures().insertMetric(m -> m.setKey("lines").setValueType(INT.toString())); - ComponentDto simpleProject = db.components().insertMainBranch(organization); + ComponentDto simpleProject = db.components().insertPublicProject(organization); db.measures().insertLiveMeasure(simpleProject, ncloc, m -> m.setValue(10d)); - ComponentDto projectWithBiggerBranch = db.components().insertMainBranch(organization); + ComponentDto projectWithBiggerBranch = db.components().insertPublicProject(organization); ComponentDto bigBranch = db.components().insertProjectBranch(projectWithBiggerBranch, b -> b.setBranchType(BranchType.BRANCH)); db.measures().insertLiveMeasure(projectWithBiggerBranch, ncloc, m -> m.setValue(100d)); db.measures().insertLiveMeasure(bigBranch, ncloc, m -> m.setValue(200d)); - ComponentDto projectWithLinesButNoLoc = db.components().insertMainBranch(organization); + ComponentDto projectWithLinesButNoLoc = db.components().insertPublicProject(organization); db.measures().insertLiveMeasure(projectWithLinesButNoLoc, lines, m -> m.setValue(365d)); db.measures().insertLiveMeasure(projectWithLinesButNoLoc, ncloc, m -> m.setValue(0d)); @@ -313,15 +313,15 @@ public class LiveMeasureDaoTest { OrganizationDto organization = db.organizations().insert(); MetricDto ncloc = db.measures().insertMetric(m -> m.setKey("ncloc").setValueType(INT.toString())); - ComponentDto simpleProject = db.components().insertMainBranch(organization); + ComponentDto simpleProject = db.components().insertPublicProject(organization); db.measures().insertLiveMeasure(simpleProject, ncloc, m -> m.setValue(10d)); - ComponentDto projectWithBiggerBranch = db.components().insertMainBranch(organization); + ComponentDto projectWithBiggerBranch = db.components().insertPublicProject(organization); ComponentDto bigBranch = db.components().insertProjectBranch(projectWithBiggerBranch, b -> b.setBranchType(BranchType.BRANCH)); db.measures().insertLiveMeasure(projectWithBiggerBranch, ncloc, m -> m.setValue(100d)); db.measures().insertLiveMeasure(bigBranch, ncloc, m -> m.setValue(200d)); - ComponentDto projectToExclude = db.components().insertMainBranch(organization); + ComponentDto projectToExclude = db.components().insertPublicProject(organization); ComponentDto projectToExcludeBranch = db.components().insertProjectBranch(projectToExclude, b -> b.setBranchType(BranchType.BRANCH)); db.measures().insertLiveMeasure(projectToExclude, ncloc, m -> m.setValue(300d)); db.measures().insertLiveMeasure(projectToExcludeBranch, ncloc, m -> m.setValue(400d)); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/measure/ProjectMeasuresIndexerIteratorTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/measure/ProjectMeasuresIndexerIteratorTest.java index 45d915148eb..770738e9106 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/measure/ProjectMeasuresIndexerIteratorTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/measure/ProjectMeasuresIndexerIteratorTest.java @@ -22,6 +22,7 @@ package org.sonar.db.measure; import com.google.common.collect.Maps; import java.util.Map; import javax.annotation.Nullable; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -206,7 +207,7 @@ public class ProjectMeasuresIndexerIteratorTest { @Test public void return_project_without_analysis() { - ComponentDto project = dbTester.components().insertComponent(ComponentTesting.newPrivateProjectDto(dbTester.organizations().insert())); + ComponentDto project = dbTester.components().insertPrivateProject(ComponentTesting.newPrivateProjectDto(dbTester.organizations().insert())); dbClient.snapshotDao().insert(dbSession, newAnalysis(project).setLast(false)); dbSession.commit(); @@ -218,6 +219,8 @@ public class ProjectMeasuresIndexerIteratorTest { } @Test + @Ignore + //TODO public void does_not_return_non_active_projects() { OrganizationDto organization = dbTester.organizations().insert(); // Disabled project diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java index 4a78c097d2c..d6fa90971d9 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java @@ -308,7 +308,7 @@ public class OrganizationDaoTest { assertThat(underTest.selectByUuids( dbSession, of(ORGANIZATION_DTO_1.getUuid().toUpperCase(Locale.ENGLISH), ORGANIZATION_DTO_2.getUuid().toUpperCase(Locale.ENGLISH)))) - .isEmpty(); + .isEmpty(); } @Test @@ -333,7 +333,7 @@ public class OrganizationDaoTest { insertOrganization(ORGANIZATION_DTO_1); insertOrgAlmBinding(ORGANIZATION_DTO_1, GITHUB, "123456"); - assertThat(underTest.selectByOrganizationAlmId(dbSession, GITHUB,"unknown")).isEmpty(); + assertThat(underTest.selectByOrganizationAlmId(dbSession, GITHUB, "unknown")).isEmpty(); } @Test @@ -1027,12 +1027,11 @@ public class OrganizationDaoTest { OrganizationDto org1 = db.organizations().insert(); // private project with highest ncloc in non-main branch - ComponentDto project1 = db.components().insertMainBranch(org1); + ComponentDto project1 = db.components().insertPrivateProject(org1); ComponentDto project1Branch = db.components().insertProjectBranch(project1); db.measures().insertLiveMeasure(project1, ncloc, m -> m.setValue(1_000.0)); db.measures().insertLiveMeasure(project1Branch, ncloc, m -> m.setValue(110_000.0)); - // public project that must be ignored ComponentDto project2 = db.components().insertPublicProject(org1); ComponentDto project2Branch = db.components().insertProjectBranch(project2); @@ -1213,15 +1212,15 @@ public class OrganizationDaoTest { private int insertPrivateProjectsWithBranches(OrganizationDto org, MetricDto ncloc) { // private project - ComponentDto project1 = db.components().insertMainBranch(org); + ComponentDto project1 = db.components().insertPrivateProject(org); return Math.max( // Create the ncloc on main branch insertLiveMeasures(project1, ncloc, 0), // Create 5 branches and set the ncloc on them IntStream.range(1, 5) - .map(i -> insertLiveMeasures(db.components().insertProjectBranch(project1), ncloc, 0)) - .max().orElse(0) + .map(i -> insertLiveMeasures(db.components().insertProjectBranch(project1), ncloc, 0)) + .max().orElse(0) ); } diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/project/ProjectDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/project/ProjectDaoTest.java new file mode 100644 index 00000000000..e35a0852c27 --- /dev/null +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/project/ProjectDaoTest.java @@ -0,0 +1,172 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.project; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import javax.annotation.Nullable; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.api.impl.utils.AlwaysIncreasingSystem2; +import org.sonar.api.resources.Qualifiers; +import org.sonar.api.utils.System2; +import org.sonar.db.DbTester; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ProjectDaoTest { + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + private System2 system2 = new AlwaysIncreasingSystem2(1000L); + + @Rule + public DbTester db = DbTester.create(system2); + + private ProjectDao projectDao = new ProjectDao(); + + @Test + public void should_insert_and_select_by_uuid() { + ProjectDto dto = createProject("o1", "p1"); + + projectDao.insert(db.getSession(), dto); + + Optional<ProjectDto> projectByUuid = projectDao.selectByUuid(db.getSession(), "uuid_o1_p1"); + assertThat(projectByUuid).isPresent(); + assertProject(projectByUuid.get(), "projectName_p1", "projectKee_o1_p1", "org_o1", "uuid_o1_p1", "desc_p1", "tag1,tag2"); + assertThat(projectByUuid.get().isPrivate()).isTrue(); + } + + @Test + public void select_project_by_key() { + ProjectDto dto = createProject("o1", "p1"); + + projectDao.insert(db.getSession(), dto); + + Optional<ProjectDto> projectByKee = projectDao.selectProjectByKey(db.getSession(), "projectKee_o1_p1"); + assertThat(projectByKee).isPresent(); + assertProject(projectByKee.get(), "projectName_p1", "projectKee_o1_p1", "org_o1", "uuid_o1_p1", "desc_p1", "tag1,tag2"); + } + + @Test + public void select_projects() { + ProjectDto dto1 = createProject("o1", "p1"); + ProjectDto dto2 = createProject("o1", "p2"); + + projectDao.insert(db.getSession(), dto1); + projectDao.insert(db.getSession(), dto2); + + List<ProjectDto> projects = projectDao.selectProjects(db.getSession()); + assertThat(projects).extracting(ProjectDto::getKey).containsExactlyInAnyOrder("projectKee_o1_p1", "projectKee_o1_p2"); + } + + @Test + public void select_by_organization_uuid() { + ProjectDto dto1 = createProject("o1", "p1"); + ProjectDto dto2 = createProject("o1", "p2"); + ProjectDto dto3 = createProject("o2", "p1"); + + projectDao.insert(db.getSession(), dto1); + projectDao.insert(db.getSession(), dto2); + projectDao.insert(db.getSession(), dto3); + + List<ProjectDto> projectsByOrg = projectDao.selectByOrganizationUuid(db.getSession(), "org_o1"); + assertThat(projectsByOrg).hasSize(2); + assertProject(projectsByOrg.get(0), "projectName_p1", "projectKee_o1_p1", "org_o1", "uuid_o1_p1", "desc_p1", "tag1,tag2"); + assertProject(projectsByOrg.get(1), "projectName_p2", "projectKee_o1_p2", "org_o1", "uuid_o1_p2", "desc_p2", "tag1,tag2"); + } + + @Test + public void update_tags() { + ProjectDto dto1 = createProject("o1", "p1").setTagsString(""); + ProjectDto dto2 = createProject("o1", "p2").setTagsString("tag1,tag2"); + + projectDao.insert(db.getSession(), dto1); + projectDao.insert(db.getSession(), dto2); + + List<ProjectDto> projectsByUuids = projectDao.selectByUuids(db.getSession(), new HashSet<>(Arrays.asList("uuid_o1_p1", "uuid_o1_p2"))); + assertThat(projectsByUuids).hasSize(2); + assertProject(projectsByUuids.get(0), "projectName_p1", "projectKee_o1_p1", "org_o1", "uuid_o1_p1", "desc_p1", null); + assertProject(projectsByUuids.get(1), "projectName_p2", "projectKee_o1_p2", "org_o1", "uuid_o1_p2", "desc_p2", "tag1,tag2"); + + dto1.setTags(Collections.singletonList("tag3")); + dto2.setTagsString(""); + projectDao.updateTags(db.getSession(), dto1); + projectDao.updateTags(db.getSession(), dto2); + + projectsByUuids = projectDao.selectByUuids(db.getSession(), new HashSet<>(Arrays.asList("uuid_o1_p1", "uuid_o1_p2"))); + assertThat(projectsByUuids).hasSize(2); + assertProject(projectsByUuids.get(0), "projectName_p1", "projectKee_o1_p1", "org_o1", "uuid_o1_p1", "desc_p1", "tag3"); + assertProject(projectsByUuids.get(1), "projectName_p2", "projectKee_o1_p2", "org_o1", "uuid_o1_p2", "desc_p2", null); + + assertThat(projectsByUuids.get(0).getTags()).containsOnly("tag3"); + } + + @Test + public void select_by_uuids() { + ProjectDto dto1 = createProject("o1", "p1"); + ProjectDto dto2 = createProject("o1", "p2"); + ProjectDto dto3 = createProject("o1", "p3"); + + projectDao.insert(db.getSession(), dto1); + projectDao.insert(db.getSession(), dto2); + projectDao.insert(db.getSession(), dto3); + + List<ProjectDto> projectsByUuids = projectDao.selectByUuids(db.getSession(), new HashSet<>(Arrays.asList("uuid_o1_p1", "uuid_o1_p2"))); + assertThat(projectsByUuids).hasSize(2); + assertProject(projectsByUuids.get(0), "projectName_p1", "projectKee_o1_p1", "org_o1", "uuid_o1_p1", "desc_p1", "tag1,tag2"); + assertProject(projectsByUuids.get(1), "projectName_p2", "projectKee_o1_p2", "org_o1", "uuid_o1_p2", "desc_p2", "tag1,tag2"); + } + + @Test + public void select_empty_by_uuids() { + ProjectDto dto1 = createProject("o1", "p1"); + ProjectDto dto2 = createProject("o1", "p2"); + ProjectDto dto3 = createProject("o1", "p3"); + + projectDao.insert(db.getSession(), dto1); + projectDao.insert(db.getSession(), dto2); + projectDao.insert(db.getSession(), dto3); + + List<ProjectDto> projectsByUuids = projectDao.selectByUuids(db.getSession(), Collections.emptySet()); + assertThat(projectsByUuids).hasSize(0); + } + + private void assertProject(ProjectDto dto, String name, String kee, String org, String uuid, String desc, @Nullable String tags) { + assertThat(dto).extracting("name", "kee", "key", "organizationUuid", "uuid", "description", "tagsString") + .containsExactly(name, kee, kee, org, uuid, desc, tags); + } + + private ProjectDto createProject(String org, String name) { + return new ProjectDto() + .setName("projectName_" + name) + .setKey("projectKee_" + org + "_" + name) + .setQualifier(Qualifiers.PROJECT) + .setOrganizationUuid("org_" + org) + .setUuid("uuid_" + org + "_" + name) + .setTags(Arrays.asList("tag1", "tag2")) + .setDescription("desc_" + name) + .setPrivate(true); + } +} diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java index 8657b4701c3..25b723c7088 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeCommandsTest.java @@ -29,7 +29,6 @@ import java.util.function.Consumer; import java.util.stream.IntStream; import java.util.stream.Stream; import org.junit.After; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -49,6 +48,7 @@ import org.sonar.db.newcodeperiod.NewCodePeriodType; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.organization.OrganizationTesting; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; @@ -82,11 +82,6 @@ public class PurgeCommandsTest { dbTester.executeUpdateSql("DELETE FROM analysis_properties"); } - @Before - public void setUp() { - - } - /** * Test that SQL queries execution do not fail with a huge number of parameter */ @@ -218,7 +213,30 @@ public class PurgeCommandsTest { underTest.deleteComponents(component.uuid()); + assertThat(dbTester.countRowsOfTable("components")).isZero(); + assertThat(dbTester.countRowsOfTable("snapshots")).isEqualTo(1); + assertThat(dbTester.countRowsOfTable("events")).isEqualTo(1); + assertThat(dbTester.countRowsOfTable("issues")).isEqualTo(1); + assertThat(dbTester.countRowsOfTable("issue_changes")).isEqualTo(1); + } + + @Test + public void deleteProjects() { + ComponentDto project = dbTester.components().insertPrivateProject(); + ProjectDto projectDto = dbTester.getDbClient().projectDao().selectProjectByKey(dbTester.getSession(), project.getDbKey()).get(); + ComponentDto file = dbTester.components().insertComponent(newFileDto(project)); + SnapshotDto analysis = dbTester.components().insertSnapshot(project); + dbTester.events().insertEvent(analysis); + IssueDto issue = dbTester.issues().insert(dbTester.rules().insert(), project, file); + dbTester.issues().insertChange(issue); + + assertThat(dbTester.countRowsOfTable("projects")).isOne(); + + underTest.deleteComponents(project.uuid()); + underTest.deleteProject(project.uuid()); + assertThat(dbTester.countRowsOfTable("projects")).isZero(); + assertThat(dbTester.countRowsOfTable("components")).isZero(); assertThat(dbTester.countRowsOfTable("snapshots")).isEqualTo(1); assertThat(dbTester.countRowsOfTable("events")).isEqualTo(1); assertThat(dbTester.countRowsOfTable("issues")).isEqualTo(1); @@ -644,7 +662,7 @@ public class PurgeCommandsTest { } private int countComponentOfRoot(ComponentDto projectOrView) { - return dbTester.countSql("select count(1) from projects where project_uuid='" + projectOrView.uuid() + "'"); + return dbTester.countSql("select count(1) from components where project_uuid='" + projectOrView.uuid() + "'"); } private void insertDuplication(ComponentDto project, SnapshotDto analysis) { diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java index 2bf42aee206..67288494451 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java @@ -75,6 +75,7 @@ import org.sonar.db.metric.MetricDto; import org.sonar.db.newcodeperiod.NewCodePeriodDto; import org.sonar.db.newcodeperiod.NewCodePeriodType; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.property.PropertyDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.source.FileSourceDto; @@ -140,7 +141,7 @@ public class PurgeDaoTest { public void purge_inactive_branches() { when(system2.now()).thenReturn(new Date().getTime()); RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch1 = db.components().insertProjectBranch(project); ComponentDto branch2 = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)); @@ -157,14 +158,15 @@ public class PurgeDaoTest { underTest.purge(dbSession, newConfigurationWith30Days(System2.INSTANCE, project.uuid(), project.uuid()), PurgeListener.EMPTY, new PurgeProfiler()); dbSession.commit(); - assertThat(uuidsIn("projects")).containsOnly(project.uuid(), branch1.uuid(), branch2.uuid()); + assertThat(uuidsIn("components")).containsOnly(project.uuid(), branch1.uuid(), branch2.uuid()); + assertThat(uuidsIn("projects")).containsOnly(project.uuid()); } @Test public void purge_inactive_pull_request() { when(system2.now()).thenReturn(new Date().getTime()); RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto nonMainBranch = db.components().insertProjectBranch(project); ComponentDto recentPullRequest = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST)); @@ -181,14 +183,15 @@ public class PurgeDaoTest { underTest.purge(dbSession, newConfigurationWith30Days(System2.INSTANCE, project.uuid(), project.uuid()), PurgeListener.EMPTY, new PurgeProfiler()); dbSession.commit(); - assertThat(uuidsIn("projects")).containsOnly(project.uuid(), nonMainBranch.uuid(), recentPullRequest.uuid()); + assertThat(uuidsIn("components")).containsOnly(project.uuid(), nonMainBranch.uuid(), recentPullRequest.uuid()); + assertThat(uuidsIn("projects")).containsOnly(project.uuid()); } @Test public void purge_inactive_branches_when_analyzing_non_main_branch() { when(system2.now()).thenReturn(new Date().getTime()); RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto nonMainBranch = db.components().insertProjectBranch(project); when(system2.now()).thenReturn(DateUtils.addDays(new Date(), -31).getTime()); @@ -208,7 +211,8 @@ public class PurgeDaoTest { dbSession.commit(); // branch1 wasn't deleted since it was being analyzed! - assertThat(uuidsIn("projects")).containsOnly(project.uuid(), nonMainBranch.uuid(), branch1.uuid()); + assertThat(uuidsIn("components")).containsOnly(project.uuid(), nonMainBranch.uuid(), branch1.uuid()); + assertThat(uuidsIn("projects")).containsOnly(project.uuid()); } @Test @@ -249,16 +253,10 @@ public class PurgeDaoTest { tuple(metricWithoutHistory.getId(), otherOldAnalysis.getUuid())); } - private Stream<Long> idsOf(String tableName) { - return db.select("select id as \"ID\" from " + tableName) - .stream() - .map(t -> (Long) t.get("ID")); - } - @Test public void close_issues_clean_index_and_file_sources_of_disabled_components_specified_by_uuid_in_configuration() { RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); db.components().insertSnapshot(project); db.components().insertSnapshot(project); db.components().insertSnapshot(project, s -> s.setLast(false)); @@ -374,7 +372,7 @@ public class PurgeDaoTest { db.events().insertEventComponentChanges(projectEvent1, projectAnalysis1, randomChangeCategory(), referencedProjectA, null); db.events().insertEventComponentChanges(projectEvent1, projectAnalysis1, randomChangeCategory(), referencedProjectB, null); BranchDto branchProjectA = newBranchDto(referencedProjectA); - ComponentDto cptBranchProjectA = ComponentTesting.newProjectBranch(referencedProjectA, branchProjectA); + ComponentDto cptBranchProjectA = ComponentTesting.newBranchComponent(referencedProjectA, branchProjectA); db.events().insertEventComponentChanges(projectEvent2, projectAnalysis2, randomChangeCategory(), cptBranchProjectA, branchProjectA); // note: projectEvent3 has no component change @@ -473,7 +471,7 @@ public class PurgeDaoTest { @Test public void selectPurgeableAnalyses_does_not_return_the_baseline() { - ComponentDto project1 = db.components().insertMainBranch(db.getDefaultOrganization(), "master"); + ComponentDto project1 = db.components().insertPublicProject(db.getDefaultOrganization(), "master"); SnapshotDto analysis1 = db.components().insertSnapshot(newSnapshot() .setComponentUuid(project1.uuid()) .setStatus(STATUS_PROCESSED) @@ -499,7 +497,7 @@ public class PurgeDaoTest { @Test public void selectPurgeableAnalyses_does_not_return_the_baseline_of_specific_branch() { - ComponentDto project = db.components().insertMainBranch(db.getDefaultOrganization(), "master"); + ComponentDto project = db.components().insertPublicProject(db.getDefaultOrganization(), "master"); SnapshotDto analysisProject = db.components().insertSnapshot(newSnapshot() .setComponentUuid(project.uuid()) .setStatus(STATUS_PROCESSED) @@ -563,7 +561,8 @@ public class PurgeDaoTest { underTest.deleteProject(dbSession, project.uuid()); dbSession.commit(); - assertThat(uuidsIn("projects")).containsOnly(otherProject.uuid(), otherModule.uuid(), otherDirectory.uuid(), otherFile.uuid()); + assertThat(uuidsIn("components")).containsOnly(otherProject.uuid(), otherModule.uuid(), otherDirectory.uuid(), otherFile.uuid()); + assertThat(uuidsIn("projects")).containsOnly(otherProject.uuid()); assertThat(uuidsIn("snapshots")).containsOnly(otherAnalysis.getUuid()); assertThat(uuidsIn("issues", "kee")).containsOnly(otherIssue1.getKey(), otherIssue2.getKey()); assertThat(uuidsIn("issue_changes", "kee")).containsOnly(otherIssueChange1.getKey()); @@ -573,21 +572,17 @@ public class PurgeDaoTest { @Test public void delete_webhooks_from_project() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project1 = db.components().insertPrivateProject(organization); + ProjectDto project1 = db.components().insertPrivateProjectDto(organization); WebhookDto webhook = db.webhooks().insertWebhook(project1); db.webhookDelivery().insert(webhook); - ComponentDto projectNotToBeDeleted = db.components().insertPrivateProject(organization); + ProjectDto projectNotToBeDeleted = db.components().insertPrivateProjectDto(organization); WebhookDto webhookNotDeleted = db.webhooks().insertWebhook(projectNotToBeDeleted); WebhookDeliveryLiteDto webhookDeliveryNotDeleted = db.webhookDelivery().insert(webhookNotDeleted); - underTest.deleteProject(dbSession, project1.uuid()); + underTest.deleteProject(dbSession, project1.getUuid()); - assertThat(db.select(db.getSession(), "select uuid as \"uuid\" from webhooks")) - .extracting(m -> m.get("uuid")) - .containsExactlyInAnyOrder(webhookNotDeleted.getUuid()); - assertThat(db.select(db.getSession(), "select uuid as \"uuid\" from webhook_deliveries")) - .extracting(m -> m.get("uuid")) - .containsExactlyInAnyOrder(webhookDeliveryNotDeleted.getUuid()); + assertThat(uuidsIn("webhooks")).containsOnly(webhookNotDeleted.getUuid()); + assertThat(uuidsIn("webhook_deliveries")).containsOnly(webhookDeliveryNotDeleted.getUuid()); } private Stream<String> uuidsOfTable(String tableName) { @@ -618,8 +613,8 @@ public class PurgeDaoTest { @Test public void delete_row_in_ce_task_input_referring_to_a_row_in_ce_activity_when_deleting_project() { ComponentDto project = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); - ComponentDto branch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); - ComponentDto anotherBranch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); + ComponentDto branch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); + ComponentDto anotherBranch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); ComponentDto anotherProject = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); dbClient.componentDao().insert(dbSession, project, branch, anotherBranch, anotherProject); @@ -650,8 +645,8 @@ public class PurgeDaoTest { @Test public void delete_row_in_ce_scanner_context_referring_to_a_row_in_ce_activity_when_deleting_project() { ComponentDto project = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); - ComponentDto branch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); - ComponentDto anotherBranch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); + ComponentDto branch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); + ComponentDto anotherBranch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); ComponentDto anotherProject = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); dbClient.componentDao().insert(dbSession, project, branch, anotherBranch, anotherProject); @@ -682,8 +677,8 @@ public class PurgeDaoTest { @Test public void delete_row_in_ce_task_characteristics_referring_to_a_row_in_ce_activity_when_deleting_project() { ComponentDto project = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); - ComponentDto branch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); - ComponentDto anotherBranch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); + ComponentDto branch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); + ComponentDto anotherBranch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); ComponentDto anotherProject = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); dbClient.componentDao().insert(dbSession, project, branch, anotherBranch, anotherProject); @@ -714,8 +709,8 @@ public class PurgeDaoTest { @Test public void delete_row_in_ce_task_message_referring_to_a_row_in_ce_activity_when_deleting_project() { ComponentDto project = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); - ComponentDto branch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); - ComponentDto anotherBranch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); + ComponentDto branch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); + ComponentDto anotherBranch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); ComponentDto anotherProject = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); dbClient.componentDao().insert(dbSession, project, branch, anotherBranch, anotherProject); @@ -765,8 +760,8 @@ public class PurgeDaoTest { @Test public void delete_row_in_ce_task_input_referring_to_a_row_in_ce_queue_when_deleting_project() { ComponentDto project = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); - ComponentDto branch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); - ComponentDto anotherBranch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); + ComponentDto branch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); + ComponentDto anotherBranch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); ComponentDto anotherProject = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); dbClient.componentDao().insert(dbSession, project, branch, anotherBranch, anotherProject); @@ -797,8 +792,8 @@ public class PurgeDaoTest { @Test public void delete_row_in_ce_scanner_context_referring_to_a_row_in_ce_queue_when_deleting_project() { ComponentDto project = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); - ComponentDto branch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); - ComponentDto anotherBranch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); + ComponentDto branch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); + ComponentDto anotherBranch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); ComponentDto anotherProject = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); dbClient.componentDao().insert(dbSession, project, branch, anotherBranch, anotherProject); @@ -830,8 +825,8 @@ public class PurgeDaoTest { @Test public void delete_row_in_ce_task_characteristics_referring_to_a_row_in_ce_queue_when_deleting_project() { ComponentDto project = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); - ComponentDto branch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); - ComponentDto anotherBranch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); + ComponentDto branch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); + ComponentDto anotherBranch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); ComponentDto anotherProject = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); dbClient.componentDao().insert(dbSession, project, branch, anotherBranch, anotherProject); @@ -863,8 +858,8 @@ public class PurgeDaoTest { @Test public void delete_row_in_ce_task_message_referring_to_a_row_in_ce_queue_when_deleting_project() { ComponentDto project = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); - ComponentDto branch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); - ComponentDto anotherBranch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); + ComponentDto branch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); + ComponentDto anotherBranch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); ComponentDto anotherProject = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); dbClient.componentDao().insert(dbSession, project, branch, anotherBranch, anotherProject); @@ -896,8 +891,8 @@ public class PurgeDaoTest { @Test public void delete_row_in_events_and_event_component_changes_when_deleting_project() { ComponentDto project = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); - ComponentDto branch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); - ComponentDto anotherBranch = ComponentTesting.newProjectBranch(project, newBranchDto(project)); + ComponentDto branch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); + ComponentDto anotherBranch = ComponentTesting.newBranchComponent(project, newBranchDto(project)); ComponentDto anotherProject = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); dbClient.componentDao().insert(dbSession, project, branch, anotherBranch, anotherProject); SnapshotDto projectAnalysis1 = db.components().insertSnapshot(project); @@ -918,7 +913,7 @@ public class PurgeDaoTest { db.events().insertEventComponentChanges(projectEvent1, projectAnalysis1, randomChangeCategory(), referencedProjectA, null); db.events().insertEventComponentChanges(projectEvent1, projectAnalysis1, randomChangeCategory(), referencedProjectB, null); BranchDto branchProjectA = newBranchDto(referencedProjectA); - ComponentDto cptBranchProjectA = ComponentTesting.newProjectBranch(referencedProjectA, branchProjectA); + ComponentDto cptBranchProjectA = ComponentTesting.newBranchComponent(referencedProjectA, branchProjectA); db.events().insertEventComponentChanges(projectEvent2, projectAnalysis2, randomChangeCategory(), cptBranchProjectA, branchProjectA); // note: projectEvent3 has no component change db.events().insertEventComponentChanges(branchEvent1, branchAnalysis1, randomChangeCategory(), referencedProjectB, null); @@ -957,7 +952,7 @@ public class PurgeDaoTest { private ComponentDto insertProjectWithBranchAndRelatedData() { RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto module = db.components().insertComponent(newModuleDto(branch)); ComponentDto subModule = db.components().insertComponent(newModuleDto(module)); @@ -971,19 +966,19 @@ public class PurgeDaoTest { @Test public void delete_branch_content_when_deleting_project() { ComponentDto anotherLivingProject = insertProjectWithBranchAndRelatedData(); - int projectEntryCount = db.countRowsOfTable("projects"); + int projectEntryCount = db.countRowsOfTable("components"); int issueCount = db.countRowsOfTable("issues"); int branchCount = db.countRowsOfTable("project_branches"); ComponentDto projectToDelete = insertProjectWithBranchAndRelatedData(); - assertThat(db.countRowsOfTable("projects")).isGreaterThan(projectEntryCount); + assertThat(db.countRowsOfTable("components")).isGreaterThan(projectEntryCount); assertThat(db.countRowsOfTable("issues")).isGreaterThan(issueCount); assertThat(db.countRowsOfTable("project_branches")).isGreaterThan(branchCount); underTest.deleteProject(dbSession, projectToDelete.uuid()); dbSession.commit(); - assertThat(db.countRowsOfTable("projects")).isEqualTo(projectEntryCount); + assertThat(db.countRowsOfTable("components")).isEqualTo(projectEntryCount); assertThat(db.countRowsOfTable("issues")).isEqualTo(issueCount); assertThat(db.countRowsOfTable("project_branches")).isEqualTo(branchCount); } @@ -1001,7 +996,7 @@ public class PurgeDaoTest { underTest.deleteProject(dbSession, view.uuid()); dbSession.commit(); - assertThat(uuidsIn("projects")) + assertThat(uuidsIn("components")) .containsOnly(project.uuid(), otherView.uuid(), otherSubView.uuid(), otherProjectCopy.uuid()); } @@ -1052,7 +1047,7 @@ public class PurgeDaoTest { @Test public void should_delete_old_closed_issues() { RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto module = db.components().insertComponent(newModuleDto(project)); ComponentDto file = db.components().insertComponent(newFileDto(module)); @@ -1083,7 +1078,7 @@ public class PurgeDaoTest { @Test public void delete_disabled_components_without_issues() { - ComponentDto project = db.components().insertMainBranch(p -> p.setEnabled(true)); + ComponentDto project = db.components().insertPublicProject(p -> p.setEnabled(true)); ComponentDto enabledFileWithIssues = db.components().insertComponent(newFileDto(project).setEnabled(true)); ComponentDto disabledFileWithIssues = db.components().insertComponent(newFileDto(project).setEnabled(false)); ComponentDto enabledFileWithoutIssues = db.components().insertComponent(newFileDto(project).setEnabled(true)); @@ -1175,7 +1170,7 @@ public class PurgeDaoTest { @Test public void delete_ce_analysis_older_than_180_and_scanner_context_older_than_40_days_of_project_and_branches_when_purging_project() { LocalDateTime now = LocalDateTime.now(); - ComponentDto project1 = db.components().insertMainBranch(); + ComponentDto project1 = db.components().insertPublicProject(); ComponentDto branch1 = db.components().insertProjectBranch(project1, b -> b.setExcludeFromPurge(true)); Consumer<CeQueueDto> belongsToProject1 = t -> t.setMainComponentUuid(project1.uuid()).setComponentUuid(project1.uuid()); Consumer<CeQueueDto> belongsToBranch1 = t -> t.setMainComponentUuid(project1.uuid()).setComponentUuid(branch1.uuid()); @@ -1378,7 +1373,7 @@ public class PurgeDaoTest { } @Test - public void deleteNonRootComponents_deletes_only_non_root_components_of_a_project_from_table_PROJECTS() { + public void deleteNonRootComponents_deletes_only_non_root_components_of_a_project_from_table_components() { ComponentDto project = new Random().nextBoolean() ? db.components().insertPublicProject() : db.components().insertPrivateProject(); ComponentDto module1 = db.components().insertComponent(ComponentTesting.newModuleDto(project)); ComponentDto module2 = db.components().insertComponent(ComponentTesting.newModuleDto(module1)); @@ -1397,12 +1392,12 @@ public class PurgeDaoTest { underTest.deleteNonRootComponentsInView(dbSession, components); - assertThat(uuidsIn("projects")) + assertThat(uuidsIn(" components")) .containsOnly(project.uuid()); } @Test - public void deleteNonRootComponents_deletes_only_non_root_components_of_a_view_from_table_PROJECTS() { + public void deleteNonRootComponents_deletes_only_non_root_components_of_a_view_from_table_components() { ComponentDto[] projects = { db.components().insertPrivateProject(), db.components().insertPrivateProject(), @@ -1423,12 +1418,12 @@ public class PurgeDaoTest { underTest.deleteNonRootComponentsInView(dbSession, components); - assertThat(uuidsIn("projects")) + assertThat(uuidsIn(" components")) .containsOnly(view.uuid(), projects[0].uuid(), projects[1].uuid(), projects[2].uuid()); } @Test - public void deleteNonRootComponents_deletes_only_specified_non_root_components_of_a_project_from_table_PROJECTS() { + public void deleteNonRootComponents_deletes_only_specified_non_root_components_of_a_project_from_table_components() { ComponentDto project = new Random().nextBoolean() ? db.components().insertPublicProject() : db.components().insertPrivateProject(); ComponentDto module1 = db.components().insertComponent(ComponentTesting.newModuleDto(project)); ComponentDto module2 = db.components().insertComponent(ComponentTesting.newModuleDto(module1)); @@ -1439,16 +1434,16 @@ public class PurgeDaoTest { ComponentDto file3 = db.components().insertComponent(newFileDto(project)); underTest.deleteNonRootComponentsInView(dbSession, singletonList(file3)); - assertThat(uuidsIn("projects")) + assertThat(uuidsIn("components")) .containsOnly(project.uuid(), module1.uuid(), module2.uuid(), dir1.uuid(), dir2.uuid(), file1.uuid(), file2.uuid()); underTest.deleteNonRootComponentsInView(dbSession, asList(module1, dir2, file1)); - assertThat(uuidsIn("projects")) + assertThat(uuidsIn("components")) .containsOnly(project.uuid(), module2.uuid(), dir1.uuid(), file2.uuid()); } @Test - public void deleteNonRootComponents_deletes_only_specified_non_root_components_of_a_view_from_table_PROJECTS() { + public void deleteNonRootComponents_deletes_only_specified_non_root_components_of_a_view_from_table_components() { ComponentDto[] projects = { db.components().insertPrivateProject(), db.components().insertPrivateProject(), @@ -1463,13 +1458,14 @@ public class PurgeDaoTest { ComponentDto pc3 = db.components().insertComponent(newProjectCopy("c", projects[2], subview2)); underTest.deleteNonRootComponentsInView(dbSession, singletonList(pc3)); - assertThat(uuidsIn("projects")) + assertThat(uuidsIn("components")) .containsOnly(view.uuid(), projects[0].uuid(), projects[1].uuid(), projects[2].uuid(), subview1.uuid(), subview2.uuid(), pc1.uuid(), pc2.uuid()); underTest.deleteNonRootComponentsInView(dbSession, asList(subview1, pc2)); - assertThat(uuidsIn("projects")) + assertThat(uuidsIn("components")) .containsOnly(view.uuid(), projects[0].uuid(), projects[1].uuid(), projects[2].uuid(), subview2.uuid(), pc1.uuid()); + assertThat(uuidsIn("projects")).containsOnly(projects[0].uuid(), projects[1].uuid(), projects[2].uuid()); } @Test diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest.java index d6b147c456b..00cfb75a2e2 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest.java @@ -27,6 +27,7 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; @@ -47,9 +48,9 @@ public class ProjectQgateAssociationDaoTest { ComponentDto project1 = db.components().insertPrivateProject(organization); ComponentDto project2 = db.components().insertPrivateProject(organization); ComponentDto project3 = db.components().insertPrivateProject(organization); - db.qualityGates().associateProjectToQualityGate(project1, qualityGate1); - db.qualityGates().associateProjectToQualityGate(project2, qualityGate1); - db.qualityGates().associateProjectToQualityGate(project3, qualityGate2); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project1), qualityGate1); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project2), qualityGate1); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project3), qualityGate2); List<ProjectQgateAssociationDto> result = underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder() .qualityGate(qualityGate1) @@ -70,8 +71,8 @@ public class ProjectQgateAssociationDaoTest { ComponentDto project1 = db.components().insertPrivateProject(organization); ComponentDto project2 = db.components().insertPrivateProject(organization); ComponentDto project3 = db.components().insertPrivateProject(organization); - db.qualityGates().associateProjectToQualityGate(project1, qualityGate); - db.qualityGates().associateProjectToQualityGate(project2, qualityGate); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project1), qualityGate); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project2), qualityGate); assertThat(underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder() .qualityGate(qualityGate) @@ -97,8 +98,8 @@ public class ProjectQgateAssociationDaoTest { ComponentDto project1 = db.components().insertPrivateProject(organization, p -> p.setName("Project One")); ComponentDto project2 = db.components().insertPrivateProject(organization, p -> p.setName("Project Two")); ComponentDto project3 = db.components().insertPrivateProject(organization, p -> p.setName("Project Three")); - db.qualityGates().associateProjectToQualityGate(project1, qualityGate); - db.qualityGates().associateProjectToQualityGate(project2, qualityGate); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project1), qualityGate); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project2), qualityGate); assertThat(underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder() .qualityGate(qualityGate) @@ -138,8 +139,8 @@ public class ProjectQgateAssociationDaoTest { QGateWithOrgDto otherQualityGate = db.qualityGates().insertQualityGate(otherOrganization); ComponentDto project = db.components().insertPrivateProject(organization); ComponentDto otherProject = db.components().insertPrivateProject(otherOrganization); - db.qualityGates().associateProjectToQualityGate(project, qualityGate); - db.qualityGates().associateProjectToQualityGate(otherProject, otherQualityGate); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project), qualityGate); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(otherProject), otherQualityGate); List<ProjectQgateAssociationDto> result = underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder() .qualityGate(qualityGate) @@ -154,7 +155,7 @@ public class ProjectQgateAssociationDaoTest { public void select_qgate_uuid_is_absent() { ComponentDto project = db.components().insertPrivateProject(); - Optional<String> result = underTest.selectQGateUuidByComponentUuid(dbSession, project.uuid()); + Optional<String> result = underTest.selectQGateUuidByProjectUuid(dbSession, project.uuid()); assertThat(result.isPresent()).isFalse(); } @@ -166,10 +167,10 @@ public class ProjectQgateAssociationDaoTest { QGateWithOrgDto qualityGate2 = db.qualityGates().insertQualityGate(organization); ComponentDto project1 = db.components().insertPrivateProject(organization); ComponentDto project2 = db.components().insertPrivateProject(organization); - db.qualityGates().associateProjectToQualityGate(project1, qualityGate1); - db.qualityGates().associateProjectToQualityGate(project2, qualityGate2); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project1), qualityGate1); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project2), qualityGate2); - Optional<String> result = underTest.selectQGateUuidByComponentUuid(dbSession, project1.uuid()); + Optional<String> result = underTest.selectQGateUuidByProjectUuid(dbSession, project1.uuid()); assertThat(result).contains(qualityGate1.getUuid()); } @@ -178,13 +179,13 @@ public class ProjectQgateAssociationDaoTest { public void delete_by_project_uuid() { OrganizationDto organization = db.organizations().insert(); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); db.qualityGates().associateProjectToQualityGate(project, qualityGate); - underTest.deleteByProjectUuid(dbSession, project.uuid()); + underTest.deleteByProjectUuid(dbSession, project.getUuid()); - Optional<String> deletedQualityGate = db.qualityGates().selectQGateUuidByComponentUuid(project.uuid()); + Optional<String> deletedQualityGate = db.qualityGates().selectQGateUuidByComponentUuid(project.getUuid()); assertThat(deletedQualityGate).isEmpty(); } @@ -193,13 +194,13 @@ public class ProjectQgateAssociationDaoTest { public void delete_by_qgate_uuid() { OrganizationDto organization = db.organizations().insert(); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); db.qualityGates().associateProjectToQualityGate(project, qualityGate); underTest.deleteByQGateUuid(dbSession, qualityGate.getUuid()); - Optional<String> deletedQualityGate = db.qualityGates().selectQGateUuidByComponentUuid(project.uuid()); + Optional<String> deletedQualityGate = db.qualityGates().selectQGateUuidByComponentUuid(project.getUuid()); assertThat(deletedQualityGate).isEmpty(); } @@ -209,13 +210,13 @@ public class ProjectQgateAssociationDaoTest { OrganizationDto organization = db.organizations().insert(); QGateWithOrgDto firstQualityGate = db.qualityGates().insertQualityGate(organization); QGateWithOrgDto secondQualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); db.qualityGates().associateProjectToQualityGate(project, firstQualityGate); - underTest.updateProjectQGateAssociation(dbSession, project.uuid(), secondQualityGate.getUuid()); + underTest.updateProjectQGateAssociation(dbSession, project.getUuid(), secondQualityGate.getUuid()); - Optional<String> updatedQualityGateUuid = db.qualityGates().selectQGateUuidByComponentUuid(project.uuid()); + Optional<String> updatedQualityGateUuid = db.qualityGates().selectQGateUuidByComponentUuid(project.getUuid()); assertThat(updatedQualityGateUuid).contains(secondQualityGate.getUuid()); } diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/QualityGateDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/QualityGateDaoTest.java index 264e8ff2c52..f9a502dcc6f 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/QualityGateDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/QualityGateDaoTest.java @@ -27,8 +27,8 @@ import org.sonar.api.utils.System2; import org.sonar.core.util.Uuids; import org.sonar.db.DbSession; import org.sonar.db.DbTester; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static java.lang.String.format; import static java.util.Arrays.asList; @@ -173,7 +173,7 @@ public class QualityGateDaoTest { public void select_by_project_uuid() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); QGateWithOrgDto qualityGate1 = db.qualityGates().insertQualityGate(organization); QGateWithOrgDto qualityGate2 = db.qualityGates().insertQualityGate(organization); @@ -183,7 +183,7 @@ public class QualityGateDaoTest { db.qualityGates().associateProjectToQualityGate(project, qualityGate1); - assertThat(underTest.selectByProjectUuid(dbSession, project.uuid()).getUuid()).isEqualTo(qualityGate1.getUuid()); + assertThat(underTest.selectByProjectUuid(dbSession, project.getUuid()).getUuid()).isEqualTo(qualityGate1.getUuid()); assertThat(underTest.selectByProjectUuid(dbSession, "not-existing-uuid")).isNull(); } diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java index a5658c673c3..2e8ec49fe34 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java @@ -39,6 +39,7 @@ import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.organization.OrganizationTesting; +import org.sonar.db.project.ProjectDto; import org.sonar.db.rule.RuleDefinitionDto; import static com.google.common.collect.ImmutableList.of; @@ -239,9 +240,12 @@ public class QualityProfileDaoTest { public void test_deleteProjectAssociationsByProfileUuids() { QProfileDto profile1 = db.qualityProfiles().insert(organization); QProfileDto profile2 = db.qualityProfiles().insert(organization); - ComponentDto project1 = db.components().insertPrivateProject(organization); - ComponentDto project2 = db.components().insertPrivateProject(organization); - ComponentDto project3 = db.components().insertPrivateProject(organization); + ProjectDto project1 = db.components().insertPrivateProjectDto(organization); + ProjectDto project2 = db.components().insertPrivateProjectDto(organization); + ProjectDto project3 = db.components().insertPrivateProjectDto(organization); + + db.getDbClient().projectDao().selectByUuid(dbSession, project1.getUuid()).get(); + db.qualityProfiles().associateWithProject(project1, profile1); db.qualityProfiles().associateWithProject(project2, profile1); db.qualityProfiles().associateWithProject(project3, profile2); @@ -250,14 +254,14 @@ public class QualityProfileDaoTest { List<Map<String, Object>> rows = db.select(dbSession, "select project_uuid as \"projectUuid\", profile_key as \"profileKey\" from project_qprofiles"); assertThat(rows).hasSize(1); - assertThat(rows.get(0).get("projectUuid")).isEqualTo(project3.uuid()); + assertThat(rows.get(0).get("projectUuid")).isEqualTo(project3.getUuid()); assertThat(rows.get(0).get("profileKey")).isEqualTo(profile2.getKee()); } @Test public void deleteProjectAssociationsByProfileUuids_does_nothing_if_empty_uuids() { QProfileDto profile = db.qualityProfiles().insert(organization); - ComponentDto project = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); db.qualityProfiles().associateWithProject(project, profile); underTest.deleteProjectAssociationsByProfileUuids(dbSession, Collections.emptyList()); @@ -562,7 +566,6 @@ public class QualityProfileDaoTest { .isNull(); } - @Test public void selectDefaultBuiltInProfilesWithoutActiveRules() { // a quality profile without active rules but not builtin @@ -651,15 +654,15 @@ public class QualityProfileDaoTest { public void countProjectsByProfileKey() { QProfileDto profileWithoutProjects = db.qualityProfiles().insert(organization); QProfileDto profileWithProjects = db.qualityProfiles().insert(organization); - ComponentDto project1 = db.components().insertPrivateProject(organization); - ComponentDto project2 = db.components().insertPrivateProject(organization); + ProjectDto project1 = db.components().insertPrivateProjectDto(organization); + ProjectDto project2 = db.components().insertPrivateProjectDto(organization); db.qualityProfiles().associateWithProject(project1, profileWithProjects); db.qualityProfiles().associateWithProject(project2, profileWithProjects); OrganizationDto otherOrg = db.organizations().insert(); QProfileDto profileInOtherOrg = db.qualityProfiles().insert(otherOrg); - ComponentDto projectInOtherOrg = db.components().insertPrivateProject(otherOrg); + ProjectDto projectInOtherOrg = db.components().insertPrivateProjectDto(otherOrg); db.qualityProfiles().associateWithProject(projectInOtherOrg, profileInOtherOrg); assertThat(underTest.countProjectsByOrganizationAndProfiles(dbSession, organization, asList(profileWithoutProjects, profileWithProjects, profileInOtherOrg))).containsOnly( @@ -671,8 +674,8 @@ public class QualityProfileDaoTest { @Test public void test_selectAssociatedToProjectAndLanguage() { OrganizationDto org = db.organizations().insert(); - ComponentDto project1 = db.components().insertPublicProject(org); - ComponentDto project2 = db.components().insertPublicProject(org); + ProjectDto project1 = db.components().insertPublicProjectDto(org); + ProjectDto project2 = db.components().insertPublicProjectDto(org); QProfileDto javaProfile = db.qualityProfiles().insert(org, p -> p.setLanguage("java")); QProfileDto jsProfile = db.qualityProfiles().insert(org, p -> p.setLanguage("js")); db.qualityProfiles().associateWithProject(project1, javaProfile, jsProfile); @@ -690,8 +693,8 @@ public class QualityProfileDaoTest { @Test public void test_selectAssociatedToProjectUuidAndLanguages() { OrganizationDto org = db.organizations().insert(); - ComponentDto project1 = db.components().insertPublicProject(org); - ComponentDto project2 = db.components().insertPublicProject(org); + ProjectDto project1 = db.components().insertPublicProjectDto(org); + ProjectDto project2 = db.components().insertPublicProjectDto(org); QProfileDto javaProfile = db.qualityProfiles().insert(org, p -> p.setLanguage("java")); QProfileDto jsProfile = db.qualityProfiles().insert(org, p -> p.setLanguage("js")); db.qualityProfiles().associateWithProject(project1, javaProfile, jsProfile); @@ -713,7 +716,7 @@ public class QualityProfileDaoTest { @Test public void test_updateProjectProfileAssociation() { OrganizationDto org = db.organizations().insert(); - ComponentDto project = db.components().insertPrivateProject(org); + ProjectDto project = db.components().insertPrivateProjectDto(org); QProfileDto javaProfile1 = db.qualityProfiles().insert(org, p -> p.setLanguage("java")); QProfileDto jsProfile = db.qualityProfiles().insert(org, p -> p.setLanguage("js")); QProfileDto javaProfile2 = db.qualityProfiles().insert(org, p -> p.setLanguage("java")); @@ -749,12 +752,12 @@ public class QualityProfileDaoTest { QProfileDto profile1 = newQualityProfileDto(); db.qualityProfiles().insert(profile1); - db.qualityProfiles().associateWithProject(project1, profile1); - db.qualityProfiles().associateWithProject(project2, profile1); + db.qualityProfiles().associateWithProject(db.components().getProjectDto(project1), profile1); + db.qualityProfiles().associateWithProject(db.components().getProjectDto(project2), profile1); QProfileDto profile2 = newQualityProfileDto(); db.qualityProfiles().insert(profile2); - db.qualityProfiles().associateWithProject(project3, profile2); + db.qualityProfiles().associateWithProject(db.components().getProjectDto(project3), profile2); QProfileDto profile3 = newQualityProfileDto(); assertThat(underTest.selectSelectedProjects(dbSession, organization, profile1, null)) @@ -778,11 +781,11 @@ public class QualityProfileDaoTest { QProfileDto profile1 = newQualityProfileDto(); db.qualityProfiles().insert(profile1); - db.qualityProfiles().associateWithProject(project1, profile1); + db.qualityProfiles().associateWithProject(db.components().getProjectDto(project1), profile1); QProfileDto profile2 = newQualityProfileDto(); db.qualityProfiles().insert(profile2); - db.qualityProfiles().associateWithProject(project2, profile2); + db.qualityProfiles().associateWithProject(db.components().getProjectDto(project2), profile2); QProfileDto profile3 = newQualityProfileDto(); assertThat(underTest.selectDeselectedProjects(dbSession, organization, profile1, null)) @@ -806,11 +809,11 @@ public class QualityProfileDaoTest { QProfileDto profile1 = newQualityProfileDto(); db.qualityProfiles().insert(profile1); - db.qualityProfiles().associateWithProject(project1, profile1); + db.qualityProfiles().associateWithProject(db.components().getProjectDto(project1), profile1); QProfileDto profile2 = newQualityProfileDto(); db.qualityProfiles().insert(profile2); - db.qualityProfiles().associateWithProject(project2, profile2); + db.qualityProfiles().associateWithProject(db.components().getProjectDto(project2), profile2); QProfileDto profile3 = newQualityProfileDto(); assertThat(underTest.selectProjectAssociations(dbSession, organization, profile1, null)) diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java index dcfcb50ebeb..08eb943f58f 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/user/UserDaoTest.java @@ -36,6 +36,7 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; @@ -520,7 +521,7 @@ public class UserDaoTest { session.commit(); - underTest.cleanHomepage(session, new ComponentDto().setUuid("dummy-project-UUID")); + underTest.cleanHomepage(session, new ProjectDto().setUuid("dummy-project-UUID")); UserDto userWithAHomepageReloaded = underTest.selectUserById(session, userUnderTest.getId()); assertThat(userWithAHomepageReloaded.getUpdatedAt()).isEqualTo(NOW); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookDaoTest.java index 001315f0f25..38e619a7a80 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/webhook/WebhookDaoTest.java @@ -29,9 +29,9 @@ import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDbTester; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDbTester; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static org.assertj.core.api.Assertions.assertThat; @@ -149,15 +149,15 @@ public class WebhookDaoTest { @Test public void cleanWebhooksOfAProject() { OrganizationDto organization = organizationDbTester.insert(); - ComponentDto componentDto = componentDbTester.insertPrivateProject(organization); - webhookDbTester.insertWebhook(componentDto); - webhookDbTester.insertWebhook(componentDto); - webhookDbTester.insertWebhook(componentDto); - webhookDbTester.insertWebhook(componentDto); + ProjectDto projectDto = componentDbTester.insertPrivateProjectDto(organization); + webhookDbTester.insertWebhook(projectDto); + webhookDbTester.insertWebhook(projectDto); + webhookDbTester.insertWebhook(projectDto); + webhookDbTester.insertWebhook(projectDto); - underTest.deleteByProject(dbSession, componentDto); + underTest.deleteByProject(dbSession, projectDto); - Optional<WebhookDto> reloaded = underTest.selectByUuid(dbSession, componentDto.uuid()); + Optional<WebhookDto> reloaded = underTest.selectByUuid(dbSession, projectDto.getUuid()); assertThat(reloaded).isEmpty(); } diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/almsettings/AlmSettingsDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/almsettings/AlmSettingsDbTester.java index 88cdf026eb4..d4fbef37f8e 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/almsettings/AlmSettingsDbTester.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/almsettings/AlmSettingsDbTester.java @@ -23,7 +23,7 @@ import java.util.function.Consumer; import org.sonar.db.DbTester; import org.sonar.db.alm.setting.AlmSettingDto; import org.sonar.db.alm.setting.ProjectAlmSettingDto; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import static java.util.Arrays.stream; import static org.sonar.db.almsettings.AlmSettingsTesting.newAzureAlmSettingDto; @@ -64,20 +64,20 @@ public class AlmSettingsDbTester { } @SafeVarargs - public final ProjectAlmSettingDto insertGitHubProjectAlmSetting(AlmSettingDto githubAlmSetting, ComponentDto project, Consumer<ProjectAlmSettingDto>... populators) { + public final ProjectAlmSettingDto insertGitHubProjectAlmSetting(AlmSettingDto githubAlmSetting, ProjectDto project, Consumer<ProjectAlmSettingDto>... populators) { return insertProjectAlmSetting(newGithubProjectAlmSettingDto(githubAlmSetting, project), populators); } - public ProjectAlmSettingDto insertAzureProjectAlmSetting(AlmSettingDto azureAlmSetting, ComponentDto project) { + public ProjectAlmSettingDto insertAzureProjectAlmSetting(AlmSettingDto azureAlmSetting, ProjectDto project) { return insertProjectAlmSetting(newAzureProjectAlmSettingDto(azureAlmSetting, project)); } - public ProjectAlmSettingDto insertGitlabProjectAlmSetting(AlmSettingDto gitlabAlmSetting, ComponentDto project) { + public ProjectAlmSettingDto insertGitlabProjectAlmSetting(AlmSettingDto gitlabAlmSetting, ProjectDto project) { return insertProjectAlmSetting(newGitlabProjectAlmSettingDto(gitlabAlmSetting, project)); } @SafeVarargs - public final ProjectAlmSettingDto insertBitbucketProjectAlmSetting(AlmSettingDto bitbucketAlmSetting, ComponentDto project, Consumer<ProjectAlmSettingDto>... populators) { + public final ProjectAlmSettingDto insertBitbucketProjectAlmSetting(AlmSettingDto bitbucketAlmSetting, ProjectDto project, Consumer<ProjectAlmSettingDto>... populators) { return insertProjectAlmSetting(newBitbucketProjectAlmSettingDto(bitbucketAlmSetting, project), populators); } diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/almsettings/AlmSettingsTesting.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/almsettings/AlmSettingsTesting.java index d9fdbe2812e..301cb563aae 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/almsettings/AlmSettingsTesting.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/almsettings/AlmSettingsTesting.java @@ -22,7 +22,7 @@ package org.sonar.db.almsettings; import org.sonar.db.alm.setting.ALM; import org.sonar.db.alm.setting.AlmSettingDto; import org.sonar.db.alm.setting.ProjectAlmSettingDto; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; @@ -59,29 +59,29 @@ public class AlmSettingsTesting { .setAlm(ALM.BITBUCKET); } - public static ProjectAlmSettingDto newGithubProjectAlmSettingDto(AlmSettingDto githubAlmSetting, ComponentDto project) { + public static ProjectAlmSettingDto newGithubProjectAlmSettingDto(AlmSettingDto githubAlmSetting, ProjectDto project) { return new ProjectAlmSettingDto() .setAlmSettingUuid(githubAlmSetting.getUuid()) - .setProjectUuid(project.uuid()) + .setProjectUuid(project.getUuid()) .setAlmRepo(randomAlphanumeric(256)); } - static ProjectAlmSettingDto newAzureProjectAlmSettingDto(AlmSettingDto azureAlmSetting, ComponentDto project) { + static ProjectAlmSettingDto newGitlabProjectAlmSettingDto(AlmSettingDto gitlabAlmSetting, ProjectDto project) { return new ProjectAlmSettingDto() - .setAlmSettingUuid(azureAlmSetting.getUuid()) - .setProjectUuid(project.uuid()); + .setAlmSettingUuid(gitlabAlmSetting.getUuid()) + .setProjectUuid(project.getUuid()); } - static ProjectAlmSettingDto newGitlabProjectAlmSettingDto(AlmSettingDto gitlabAlmSetting, ComponentDto project) { + static ProjectAlmSettingDto newAzureProjectAlmSettingDto(AlmSettingDto azureAlmSetting, ProjectDto project) { return new ProjectAlmSettingDto() - .setAlmSettingUuid(gitlabAlmSetting.getUuid()) - .setProjectUuid(project.uuid()); + .setAlmSettingUuid(azureAlmSetting.getUuid()) + .setProjectUuid(project.getUuid()); } - public static ProjectAlmSettingDto newBitbucketProjectAlmSettingDto(AlmSettingDto githubAlmSetting, ComponentDto project) { + public static ProjectAlmSettingDto newBitbucketProjectAlmSettingDto(AlmSettingDto githubAlmSetting, ProjectDto project) { return new ProjectAlmSettingDto() .setAlmSettingUuid(githubAlmSetting.getUuid()) - .setProjectUuid(project.uuid()) + .setProjectUuid(project.getUuid()) .setAlmRepo(randomAlphanumeric(256)) .setAlmSlug(randomAlphanumeric(256)); } 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 b6072571857..3ca21fd8abf 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 @@ -22,10 +22,13 @@ package org.sonar.db.component; import java.util.Arrays; import java.util.function.Consumer; import javax.annotation.Nullable; +import org.sonar.api.resources.Qualifiers; +import org.sonar.api.utils.System2; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; @@ -44,19 +47,13 @@ public class ComponentDbTester { } public SnapshotDto insertProjectAndSnapshot(ComponentDto component) { - return insertComponentAndSnapshot(component); + insertComponentAndBranchAndProject(component, null, noExtraConfiguration()); + return insertSnapshot(component); } public SnapshotDto insertViewAndSnapshot(ComponentDto component) { - return insertComponentAndSnapshot(component); - } - - private SnapshotDto insertComponentAndSnapshot(ComponentDto component) { dbClient.componentDao().insert(dbSession, component); - SnapshotDto snapshot = dbClient.snapshotDao().insert(dbSession, SnapshotTesting.newAnalysis(component)); - db.commit(); - - return snapshot; + return insertSnapshot(component); } public ComponentDto insertComponent(ComponentDto component) { @@ -64,52 +61,107 @@ public class ComponentDbTester { } public ComponentDto insertPrivateProject() { - return insertComponentImpl(ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()), true, noExtraConfiguration()); + return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()), true, noExtraConfiguration()); + } + + public ProjectDto getProjectDto(ComponentDto project) { + return db.getDbClient().projectDao().selectByUuid(dbSession, project.uuid()).get(); + } + + public ComponentDto insertPrivateProject(ComponentDto componentDto) { + return insertComponentAndBranchAndProject(componentDto, true, noExtraConfiguration()); } public ComponentDto insertPublicProject() { - return insertComponentImpl(ComponentTesting.newPublicProjectDto(db.getDefaultOrganization()), false, noExtraConfiguration()); + return insertComponentAndBranchAndProject(ComponentTesting.newPublicProjectDto(db.getDefaultOrganization()), false, noExtraConfiguration()); + } + + public ComponentDto insertPublicProject(ComponentDto componentDto) { + return insertComponentAndBranchAndProject(componentDto, false, noExtraConfiguration()); } @SafeVarargs public final ComponentDto insertPrivateProject(Consumer<ComponentDto>... dtoPopulators) { - return insertComponentImpl(ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()), true, dtoPopulators); + return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()), true, null, dtoPopulators); } @SafeVarargs public final ComponentDto insertPublicProject(Consumer<ComponentDto>... dtoPopulators) { - return insertComponentImpl(ComponentTesting.newPublicProjectDto(db.getDefaultOrganization()), false, dtoPopulators); + return insertComponentAndBranchAndProject(ComponentTesting.newPublicProjectDto(db.getDefaultOrganization()), false, null, dtoPopulators); } @SafeVarargs public final ComponentDto insertPrivateProject(OrganizationDto organizationDto, Consumer<ComponentDto>... dtoPopulators) { - return insertComponentImpl(ComponentTesting.newPrivateProjectDto(organizationDto), true, dtoPopulators); + return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(organizationDto), true, null, dtoPopulators); } @SafeVarargs public final ComponentDto insertPublicProject(OrganizationDto organizationDto, Consumer<ComponentDto>... dtoPopulators) { - return insertComponentImpl(ComponentTesting.newPublicProjectDto(organizationDto), false, dtoPopulators); + return insertComponentAndBranchAndProject(ComponentTesting.newPublicProjectDto(organizationDto), false, null, dtoPopulators); } public ComponentDto insertPrivateProject(OrganizationDto organizationDto) { - return insertComponentImpl(ComponentTesting.newPrivateProjectDto(organizationDto), true, noExtraConfiguration()); + return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(organizationDto), true, noExtraConfiguration()); } public ComponentDto insertPublicProject(OrganizationDto organizationDto) { - return insertComponentImpl(ComponentTesting.newPublicProjectDto(organizationDto), false, noExtraConfiguration()); + return insertComponentAndBranchAndProject(ComponentTesting.newPublicProjectDto(organizationDto), false, noExtraConfiguration()); + } + + public ProjectDto insertPublicProjectDto() { + ComponentDto componentDto = insertPublicProject(); + return getProjectDto(componentDto); + } + + public ProjectDto insertPrivateProjectDto() { + ComponentDto componentDto = insertPrivateProject(); + return getProjectDto(componentDto); + } + + public ProjectDto insertPublicProjectDto(OrganizationDto organization) { + ComponentDto componentDto = insertPublicProject(organization); + return getProjectDto(componentDto); + } + + @SafeVarargs + public final ProjectDto insertPublicProjectDto(OrganizationDto organization, Consumer<ComponentDto>... dtoPopulators) { + ComponentDto componentDto = insertPublicProject(organization, dtoPopulators); + return getProjectDto(componentDto); + } + + public ProjectDto insertPrivateProjectDto(OrganizationDto organization) { + ComponentDto componentDto = insertPrivateProject(organization); + return getProjectDto(componentDto); + } + + @SafeVarargs + public final ProjectDto insertPrivateProjectDto(Consumer<ComponentDto>... dtoPopulators) { + ComponentDto componentDto = insertPrivateProject(dtoPopulators); + return getProjectDto(componentDto); + } + + public ProjectDto insertPrivateProjectDto(OrganizationDto organization, Consumer<BranchDto> branchConsumer) { + ComponentDto componentDto = insertPrivateProjectWithCustomBranch(organization, branchConsumer); + return getProjectDto(componentDto); } public ComponentDto insertPrivateProject(OrganizationDto organizationDto, String uuid) { - return insertComponentImpl(ComponentTesting.newPrivateProjectDto(organizationDto, uuid), true, noExtraConfiguration()); + return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(organizationDto, uuid), true, noExtraConfiguration()); } public ComponentDto insertPublicProject(OrganizationDto organizationDto, String uuid) { - return insertComponentImpl(ComponentTesting.newPublicProjectDto(organizationDto, uuid), false, noExtraConfiguration()); + return insertComponentAndBranchAndProject(ComponentTesting.newPublicProjectDto(organizationDto, uuid), false, noExtraConfiguration()); } @SafeVarargs public final ComponentDto insertPrivateProject(OrganizationDto organizationDto, String uuid, Consumer<ComponentDto>... dtoPopulators) { - return insertComponentImpl(ComponentTesting.newPrivateProjectDto(organizationDto, uuid), true, dtoPopulators); + return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(organizationDto, uuid), true, null, dtoPopulators); + } + + @SafeVarargs + public final ComponentDto insertPrivateProjectWithCustomBranch(OrganizationDto organizationDto, Consumer<BranchDto> branchPopulator, + Consumer<ComponentDto>... componentPopulator) { + return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(organizationDto), true, branchPopulator, componentPopulator); } /** @@ -183,7 +235,8 @@ public class ComponentDbTester { @SafeVarargs public final ComponentDto insertPublicApplication(OrganizationDto organization, Consumer<ComponentDto>... dtoPopulators) { - return insertComponentImpl(ComponentTesting.newApplication(organization).setPrivate(false), false, dtoPopulators); + return insertComponentAndBranchAndProject(ComponentTesting.newApplication(organization).setPrivate(false), false, b -> { + }, dtoPopulators); } @SafeVarargs @@ -193,7 +246,8 @@ public class ComponentDbTester { @SafeVarargs public final ComponentDto insertPrivateApplication(OrganizationDto organization, Consumer<ComponentDto>... dtoPopulators) { - return insertComponentImpl(ComponentTesting.newApplication(organization).setPrivate(true), true, dtoPopulators); + return insertComponentAndBranchAndProject(ComponentTesting.newApplication(organization).setPrivate(true), true, b -> { + }, dtoPopulators); } /** @@ -202,12 +256,13 @@ public class ComponentDbTester { */ @SafeVarargs public final ComponentDto insertApplication(OrganizationDto organizationDto, Consumer<ComponentDto>... dtoPopulators) { - return insertComponentImpl(ComponentTesting.newApplication(organizationDto), false, dtoPopulators); + return insertComponentAndBranchAndProject(ComponentTesting.newApplication(organizationDto), false, b -> { + }, dtoPopulators); } @SafeVarargs public final ComponentDto insertSubView(ComponentDto view, Consumer<ComponentDto>... dtoPopulators) { - return insertComponentImpl(ComponentTesting.newSubView(view), view.isPrivate(), dtoPopulators); + return insertComponentAndBranchAndProject(ComponentTesting.newSubView(view), view.isPrivate(), null, dtoPopulators); } private static <T> Consumer<T> noExtraConfiguration() { @@ -216,9 +271,28 @@ public class ComponentDbTester { } @SafeVarargs + private final ComponentDto insertComponentAndBranchAndProject(ComponentDto component, @Nullable Boolean isPrivate, @Nullable Consumer<BranchDto> branchPopulator, + Consumer<ComponentDto>... dtoPopulators) { + insertComponentImpl(component, isPrivate, dtoPopulators); + + ProjectDto projectDto = toProjectDto(component, System2.INSTANCE.now()); + dbClient.projectDao().insert(dbSession, projectDto); + + BranchDto branchDto = ComponentTesting.newBranchDto(component, BRANCH); + branchDto.setExcludeFromPurge(true); + + if (branchPopulator != null) { + branchPopulator.accept(branchDto); + } + dbClient.branchDao().insert(dbSession, branchDto); + + db.commit(); + return component; + } + + @SafeVarargs private final ComponentDto insertComponentImpl(ComponentDto component, @Nullable Boolean isPrivate, Consumer<ComponentDto>... dtoPopulators) { - Arrays.stream(dtoPopulators) - .forEach(dtoPopulator -> dtoPopulator.accept(component)); + Arrays.stream(dtoPopulators).forEach(dtoPopulator -> dtoPopulator.accept(component)); checkState(isPrivate == null || component.isPrivate() == isPrivate, "Illegal modification of private flag"); dbClient.componentDao().insert(dbSession, component); db.commit(); @@ -244,9 +318,17 @@ public class ComponentDbTester { public SnapshotDto insertSnapshot(ComponentDto componentDto, Consumer<SnapshotDto> consumer) { SnapshotDto snapshotDto = SnapshotTesting.newAnalysis(componentDto); consumer.accept(snapshotDto); - SnapshotDto snapshot = dbClient.snapshotDao().insert(dbSession, snapshotDto); - db.commit(); - return snapshot; + return insertSnapshot(snapshotDto); + } + + public SnapshotDto insertSnapshot(BranchDto branchDto) { + return insertSnapshot(branchDto, noExtraConfiguration()); + } + + public SnapshotDto insertSnapshot(BranchDto branchDto, Consumer<SnapshotDto> consumer) { + SnapshotDto snapshotDto = SnapshotTesting.newAnalysis(branchDto); + consumer.accept(snapshotDto); + return insertSnapshot(snapshotDto); } public void insertSnapshots(SnapshotDto... snapshotDtos) { @@ -255,59 +337,40 @@ public class ComponentDbTester { } @SafeVarargs - public final ComponentDto insertMainBranch(Consumer<ComponentDto>... dtoPopulators) { - return insertMainBranch(db.getDefaultOrganization(), dtoPopulators); + public final ComponentDto insertProjectBranch(ComponentDto project, Consumer<BranchDto>... dtoPopulators) { + // MainBranchProjectUuid will be null if it's a main branch + BranchDto branchDto = ComponentTesting.newBranchDto(firstNonNull(project.getMainBranchProjectUuid(), project.projectUuid()), BRANCH); + Arrays.stream(dtoPopulators).forEach(dtoPopulator -> dtoPopulator.accept(branchDto)); + return insertProjectBranch(project, branchDto); } @SafeVarargs - public final ComponentDto insertMainBranch(OrganizationDto organization, Consumer<ComponentDto>... dtoPopulators) { - ComponentDto project = ComponentTesting.newPrivateProjectDto(organization); - Arrays.stream(dtoPopulators).forEach(dtoPopulator -> dtoPopulator.accept(project)); - return insertMainBranch(project); - } - - public final ComponentDto insertMainBranch(ComponentDto project) { - BranchDto branchDto = ComponentTesting.newBranchDto(project, BRANCH); - branchDto.setExcludeFromPurge(true); - insertComponent(project); - dbClient.branchDao().insert(dbSession, branchDto); - db.commit(); - return project; + public final BranchDto insertProjectBranch(ProjectDto project, Consumer<BranchDto>... dtoPopulators) { + BranchDto branchDto = ComponentTesting.newBranchDto(project.getUuid(), BRANCH); + Arrays.stream(dtoPopulators).forEach(dtoPopulator -> dtoPopulator.accept(branchDto)); + insertProjectBranch(project, branchDto); + return branchDto; } @SafeVarargs - public final ComponentDto insertMainBranch(OrganizationDto organization, String mainBranchName, Consumer<ComponentDto>... dtoPopulators) { + public final ComponentDto insertProjectBranch(OrganizationDto organization, Consumer<BranchDto>... dtoPopulators) { ComponentDto project = ComponentTesting.newPrivateProjectDto(organization); - BranchDto branchDto = ComponentTesting.newBranchDto(project, BRANCH).setKey(mainBranchName); - Arrays.stream(dtoPopulators).forEach(dtoPopulator -> dtoPopulator.accept(project)); - insertComponent(project); - dbClient.branchDao().insert(dbSession, branchDto); - db.commit(); - return project; + return insertProjectBranch(project, dtoPopulators); } - @SafeVarargs - public final ComponentDto insertProjectBranch(ComponentDto project, Consumer<BranchDto>... dtoPopulators) { - // MainBranchProjectUuid will be null if it's a main branch - BranchDto branchDto = ComponentTesting.newBranchDto(firstNonNull(project.getMainBranchProjectUuid(), project.projectUuid()), BRANCH); - Arrays.stream(dtoPopulators).forEach(dtoPopulator -> dtoPopulator.accept(branchDto)); - ComponentDto branch = ComponentTesting.newProjectBranch(project, branchDto); + public final ComponentDto insertProjectBranch(ProjectDto project, BranchDto branchDto) { + checkArgument(branchDto.getProjectUuid().equals(project.getUuid())); + ComponentDto branch = ComponentTesting.newBranchComponent(project, branchDto); insertComponent(branch); dbClient.branchDao().insert(dbSession, branchDto); db.commit(); return branch; } - @SafeVarargs - public final ComponentDto insertProjectBranch(OrganizationDto organization, Consumer<BranchDto>... dtoPopulators) { - ComponentDto project = ComponentTesting.newPrivateProjectDto(organization); - return insertProjectBranch(project, dtoPopulators); - } - public final ComponentDto insertProjectBranch(ComponentDto project, BranchDto branchDto) { // MainBranchProjectUuid will be null if it's a main branch checkArgument(branchDto.getProjectUuid().equals(firstNonNull(project.getMainBranchProjectUuid(), project.projectUuid()))); - ComponentDto branch = ComponentTesting.newProjectBranch(project, branchDto); + ComponentDto branch = ComponentTesting.newBranchComponent(project, branchDto); insertComponent(branch); dbClient.branchDao().insert(dbSession, branchDto); db.commit(); @@ -318,4 +381,19 @@ public class ComponentDbTester { return (first != null) ? first : second; } + // TODO temporary constructor to quickly create project from previous project component. + private ProjectDto toProjectDto(ComponentDto componentDto, long createTime) { + return new ProjectDto() + .setUuid(componentDto.uuid()) + .setKey(componentDto.getDbKey()) + .setQualifier(componentDto.qualifier() != null ? componentDto.qualifier() : Qualifiers.PROJECT) + .setCreatedAt(createTime) + .setUpdatedAt(createTime) + .setPrivate(componentDto.isPrivate()) + .setDescription(componentDto.description()) + .setName(componentDto.name()) + .setOrganizationUuid(componentDto.getOrganizationUuid()) + .setTags(componentDto.getTags()) + .setTagsString(componentDto.getTagsString()); + } } diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/ComponentTesting.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/ComponentTesting.java index 906c3dad596..bb57f615b1b 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/ComponentTesting.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/ComponentTesting.java @@ -25,6 +25,7 @@ import org.sonar.api.resources.Qualifiers; import org.sonar.api.resources.Scopes; import org.sonar.core.util.Uuids; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; @@ -126,6 +127,10 @@ public class ComponentTesting { return newProjectDto(organizationDto.getUuid(), Uuids.createFast(), true); } + public static ProjectDto createPrivateProjectDto(OrganizationDto organizationDto) { + return createProjectDto(organizationDto.getUuid(), Uuids.createFast(), true); + } + public static ComponentDto newPrivateProjectDto(OrganizationDto organizationDto, String uuid) { return newProjectDto(organizationDto.getUuid(), uuid, true); } @@ -138,6 +143,17 @@ public class ComponentTesting { return newProjectDto(organizationDto.getUuid(), uuid, false); } + private static ProjectDto createProjectDto(String organizationUuid, String uuid, boolean isPrivate) { + return new ProjectDto() + .setOrganizationUuid(organizationUuid) + .setUuid(uuid) + .setKey("KEY_" + uuid) + .setQualifier(Qualifiers.PROJECT) + .setName("NAME_" + uuid) + .setDescription("DESCRIPTION_" + uuid) + .setPrivate(isPrivate); + } + private static ComponentDto newProjectDto(String organizationUuid, String uuid, boolean isPrivate) { return new ComponentDto() .setId(nextLong()) @@ -248,7 +264,33 @@ public class ComponentTesting { .setBranchType(branchType); } - public static ComponentDto newProjectBranch(ComponentDto project, BranchDto branchDto) { + public static ComponentDto newBranchComponent(ProjectDto project, BranchDto branchDto) { + String branchName = branchDto.getKey(); + String branchSeparator = branchDto.getBranchType() == PULL_REQUEST ? PULL_REQUEST_SEPARATOR : BRANCH_KEY_SEPARATOR; + String uuid = branchDto.getUuid(); + return new ComponentDto() + .setUuid(uuid) + .setOrganizationUuid(project.getOrganizationUuid()) + .setUuidPath(UUID_PATH_OF_ROOT) + .setProjectUuid(uuid) + .setModuleUuidPath(UUID_PATH_SEPARATOR + uuid + UUID_PATH_SEPARATOR) + .setRootUuid(uuid) + // name of the branch is not mandatory on the main branch + .setDbKey(branchName != null ? project.getKey() + branchSeparator + branchName : project.getKey()) + .setMainBranchProjectUuid(project.getUuid()) + .setName(project.getName()) + .setLongName(project.getName()) + .setDescription(project.getDescription()) + .setScope(Scopes.PROJECT) + .setQualifier(Qualifiers.PROJECT) + .setPath(null) + .setLanguage(null) + .setEnabled(true) + .setPrivate(project.isPrivate()); + } + + + public static ComponentDto newBranchComponent(ComponentDto project, BranchDto branchDto) { checkArgument(project.qualifier().equals(Qualifiers.PROJECT) || project.qualifier().equals(Qualifiers.APP)); checkArgument(project.getMainBranchProjectUuid() == null); String branchName = branchDto.getKey(); diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/SnapshotTesting.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/SnapshotTesting.java index 34e8cfba45d..1f76a826c89 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/SnapshotTesting.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/SnapshotTesting.java @@ -29,9 +29,18 @@ public class SnapshotTesting { public static SnapshotDto newAnalysis(ComponentDto rootComponent) { checkNotNull(rootComponent.uuid(), "Project UUID must be set"); checkArgument(rootComponent.uuid().equals(rootComponent.projectUuid()), "Component is not a tree root"); + return newAnalysis(rootComponent.uuid()); + } + + public static SnapshotDto newAnalysis(BranchDto branchDto) { + checkNotNull(branchDto.getUuid(), "Project UUID must be set"); + return newAnalysis(branchDto.getUuid()); + } + + public static SnapshotDto newAnalysis(String uuid) { return new SnapshotDto() .setUuid(randomAlphanumeric(40)) - .setComponentUuid(rootComponent.uuid()) + .setComponentUuid(uuid) .setStatus(SnapshotDto.STATUS_PROCESSED) .setCreatedAt(System.currentTimeMillis()) .setBuildDate(System.currentTimeMillis()) diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/issue/IssueDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/issue/IssueDbTester.java index b548d87b8cd..21a0ceb7fdd 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/issue/IssueDbTester.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/issue/IssueDbTester.java @@ -30,6 +30,7 @@ import org.sonar.core.issue.FieldDiffs; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.user.UserDto; @@ -66,7 +67,7 @@ public class IssueDbTester { @SafeVarargs public final IssueDto insert(OrganizationDto organizationDto, Consumer<IssueDto>... populators) { RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(organizationDto); + ComponentDto project = db.components().insertPublicProject(organizationDto); ComponentDto file = db.components().insertComponent(newFileDto(project)); IssueDto issue = newIssue(rule, project, file); stream(populators).forEach(p -> p.accept(issue)); @@ -98,6 +99,13 @@ public class IssueDbTester { return insertIssue(issue); } + @SafeVarargs + public final IssueDto insert(RuleDefinitionDto rule, ProjectDto project, ComponentDto file, Consumer<IssueDto>... populators) { + IssueDto issue = newIssue(rule, project, file); + stream(populators).forEach(p -> p.accept(issue)); + return insert(issue); + } + /** * Inserts an issue. * @@ -126,7 +134,7 @@ public class IssueDbTester { @SafeVarargs public final IssueDto insertIssue(OrganizationDto organizationDto, Consumer<IssueDto>... populators) { RuleDefinitionDto rule = db.rules().insertIssueRule(); - ComponentDto project = db.components().insertMainBranch(organizationDto); + ComponentDto project = db.components().insertPrivateProject(organizationDto); ComponentDto file = db.components().insertComponent(newFileDto(project)); IssueDto issue = newIssue(rule, project, file) .setType(RULE_TYPES_EXCEPT_HOTSPOTS[new Random().nextInt(RULE_TYPES_EXCEPT_HOTSPOTS.length)]); @@ -191,7 +199,7 @@ public class IssueDbTester { @SafeVarargs public final IssueDto insertHotspot(OrganizationDto organizationDto, Consumer<IssueDto>... populators) { RuleDefinitionDto rule = db.rules().insertHotspotRule(); - ComponentDto project = db.components().insertMainBranch(organizationDto); + ComponentDto project = db.components().insertPrivateProject(organizationDto); ComponentDto file = db.components().insertComponent(newFileDto(project)); IssueDto issue = newIssue(rule, project, file) .setType(SECURITY_HOTSPOT) diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/qualitygate/QualityGateDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/qualitygate/QualityGateDbTester.java index b64dc53adb9..596b2e04471 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/qualitygate/QualityGateDbTester.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/qualitygate/QualityGateDbTester.java @@ -27,9 +27,9 @@ import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; -import org.sonar.db.component.ComponentDto; import org.sonar.db.metric.MetricDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; import static org.apache.commons.lang.RandomStringUtils.randomNumeric; @@ -69,8 +69,8 @@ public class QualityGateDbTester { return dbClient.qualityGateDao().selectByOrganizationAndUuid(dbSession, organization, qualityGate.getUuid()); } - public void associateProjectToQualityGate(ComponentDto component, QualityGateDto qualityGate) { - dbClient.projectQgateAssociationDao().insertProjectQGateAssociation(dbSession, component.uuid(), qualityGate.getUuid()); + public void associateProjectToQualityGate(ProjectDto project, QualityGateDto qualityGate) { + dbClient.projectQgateAssociationDao().insertProjectQGateAssociation(dbSession, project.getUuid(), qualityGate.getUuid()); db.commit(); } @@ -104,6 +104,6 @@ public class QualityGateDbTester { } public Optional<String> selectQGateUuidByComponentUuid(String componentUuid) { - return dbClient.projectQgateAssociationDao().selectQGateUuidByComponentUuid(dbSession, componentUuid); + return dbClient.projectQgateAssociationDao().selectQGateUuidByProjectUuid(dbSession, componentUuid); } } diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/qualityprofile/QualityProfileDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/qualityprofile/QualityProfileDbTester.java index 6231216dc32..e50bba618d7 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/qualityprofile/QualityProfileDbTester.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/qualityprofile/QualityProfileDbTester.java @@ -27,8 +27,8 @@ import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; @@ -79,7 +79,7 @@ public class QualityProfileDbTester { return this; } - public QualityProfileDbTester associateWithProject(ComponentDto project, QProfileDto profile, QProfileDto... otherProfiles) { + public QualityProfileDbTester associateWithProject(ProjectDto project, QProfileDto profile, QProfileDto... otherProfiles) { dbClient.qualityProfileDao().insertProjectProfileAssociation(dbSession, project, profile); for (QProfileDto p : otherProfiles) { dbClient.qualityProfileDao().insertProjectProfileAssociation(dbSession, project, p); diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java index ff8a9ab2717..98ff4bb4454 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java @@ -36,6 +36,7 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.GroupPermissionDto; import org.sonar.db.permission.OrganizationPermission; import org.sonar.db.permission.UserPermissionDto; +import org.sonar.db.project.ProjectDto; import static com.google.common.base.Preconditions.checkArgument; import static java.lang.String.format; diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/webhook/WebhookDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/webhook/WebhookDbTester.java index 423fb65fd9f..ff6ce61641b 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/webhook/WebhookDbTester.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/webhook/WebhookDbTester.java @@ -24,6 +24,7 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import static org.sonar.db.webhook.WebhookTesting.newWebhook; @@ -39,7 +40,7 @@ public class WebhookDbTester { return insert(newWebhook(organizationDto)); } - public WebhookDto insertWebhook(ComponentDto project) { + public WebhookDto insertWebhook(ProjectDto project) { return insert(newWebhook(project)); } diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/webhook/WebhookTesting.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/webhook/WebhookTesting.java index b2c7749d4ae..16d512aec55 100644 --- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/webhook/WebhookTesting.java +++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/webhook/WebhookTesting.java @@ -20,11 +20,10 @@ package org.sonar.db.webhook; import java.util.Arrays; +import java.util.Calendar; import java.util.function.Consumer; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; - -import java.util.Calendar; +import org.sonar.db.project.ProjectDto; import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric; @@ -34,9 +33,9 @@ public class WebhookTesting { // only statics } - public static WebhookDto newWebhook(ComponentDto project) { + public static WebhookDto newWebhook(ProjectDto project) { return getWebhookDto() - .setProjectUuid(project.uuid()); + .setProjectUuid(project.getUuid()); } public static WebhookDto newProjectWebhook(String projectUuid) { @@ -52,8 +51,8 @@ public class WebhookTesting { @SafeVarargs public static WebhookDto newOrganizationWebhook(String name, String organizationUuid, Consumer<WebhookDto>... consumers) { return getWebhookDto(consumers) - .setName(name) - .setOrganizationUuid(organizationUuid); + .setName(name) + .setOrganizationUuid(organizationUuid); } @SafeVarargs diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/CreateProjectsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/CreateProjectsTable.java new file mode 100644 index 00000000000..2cba7537cca --- /dev/null +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/CreateProjectsTable.java @@ -0,0 +1,129 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.server.platform.db.migration.version.v81; + +import java.sql.Connection; +import java.sql.SQLException; +import org.sonar.db.Database; +import org.sonar.db.DatabaseUtils; +import org.sonar.server.platform.db.migration.def.BigIntegerColumnDef; +import org.sonar.server.platform.db.migration.def.BooleanColumnDef; +import org.sonar.server.platform.db.migration.def.VarcharColumnDef; +import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder; +import org.sonar.server.platform.db.migration.sql.CreateTableBuilder; +import org.sonar.server.platform.db.migration.step.DdlChange; + +import static org.sonar.server.platform.db.migration.def.BigIntegerColumnDef.newBigIntegerColumnDefBuilder; +import static org.sonar.server.platform.db.migration.def.BooleanColumnDef.newBooleanColumnDefBuilder; +import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE; +import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder; + +public class CreateProjectsTable extends DdlChange { + + private static final String TABLE_NAME = "projects"; + + private static final VarcharColumnDef UUID_COLUMN = newVarcharColumnDefBuilder() + .setColumnName("uuid") + .setIsNullable(false) + .setLimit(UUID_SIZE) + .build(); + private static final VarcharColumnDef KEE_COLUMN = newVarcharColumnDefBuilder() + .setColumnName("kee") + .setIsNullable(false) + .setLimit(400) + .build(); + private static final VarcharColumnDef QUALIFIER_COLUMN = newVarcharColumnDefBuilder() + .setColumnName("qualifier") + .setIsNullable(false) + .setLimit(10) + .build(); + private static final VarcharColumnDef ORGANIZATION_UUID_COLUMN = newVarcharColumnDefBuilder() + .setColumnName("organization_uuid") + .setIsNullable(false) + .setLimit(UUID_SIZE) + .build(); + private static final VarcharColumnDef NAME_COLUMN = newVarcharColumnDefBuilder() + .setColumnName("name") + .setLimit(2000) + .build(); + private static final VarcharColumnDef DESCRIPTION_COLUMN = newVarcharColumnDefBuilder() + .setColumnName("description") + .setLimit(2000) + .build(); + private static final BooleanColumnDef PRIVATE_COLUMN = newBooleanColumnDefBuilder() + .setColumnName("private") + .setIsNullable(false) + .build(); + private static final VarcharColumnDef TAGS_COLUMN = newVarcharColumnDefBuilder() + .setColumnName("tags") + .setLimit(500) + .build(); + private static final BigIntegerColumnDef CREATED_AT = newBigIntegerColumnDefBuilder() + .setColumnName("created_at") + .setIsNullable(false) + .build(); + private static final BigIntegerColumnDef UPDATED_AT = newBigIntegerColumnDefBuilder() + .setColumnName("updated_at") + .setIsNullable(false) + .build(); + + public CreateProjectsTable(Database db) { + super(db); + } + + @Override + public void execute(Context context) throws SQLException { + if (tableExists()) { + return; + } + context.execute(new CreateTableBuilder(getDialect(), TABLE_NAME) + .withPkConstraintName("pk_new_projects") + .addPkColumn(UUID_COLUMN) + .addColumn(KEE_COLUMN) + .addColumn(QUALIFIER_COLUMN) + .addColumn(ORGANIZATION_UUID_COLUMN) + .addColumn(NAME_COLUMN) + .addColumn(DESCRIPTION_COLUMN) + .addColumn(PRIVATE_COLUMN) + .addColumn(TAGS_COLUMN) + .addColumn(CREATED_AT) + .addColumn(UPDATED_AT) + .build()); + + context.execute(new CreateIndexBuilder() + .setTable(TABLE_NAME) + .setName("uniq_projects_kee") + .setUnique(true) + .addColumn(KEE_COLUMN) + .build()); + + context.execute(new CreateIndexBuilder() + .setTable(TABLE_NAME) + .setName("idx_qualifier") + .addColumn(QUALIFIER_COLUMN) + .build()); + } + + private boolean tableExists() throws SQLException { + try (Connection connection = getDatabase().getDataSource().getConnection()) { + return DatabaseUtils.tableExists(TABLE_NAME, connection); + } + } +} diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/DbVersion81.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/DbVersion81.java index 997f9362c41..bf10947b099 100644 --- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/DbVersion81.java +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/DbVersion81.java @@ -42,6 +42,10 @@ public class DbVersion81 implements DbVersion { RenameDaysBeforeDeletingInactiveSLBSetting.class) .add(3112, "Migrate short and long living branches types to common BRANCH type", MigrateSlbsAndLlbsToCommonType.class) .add(3113, "Migrate short and long living branches types to common BRANCH type in ce tasks table", - MigrateSlbsAndLlbsToCommonTypeInCeTasks.class); + MigrateSlbsAndLlbsToCommonTypeInCeTasks.class) + .add(3114, "Rename table 'PROJECTS' to 'COMPONENTS'", RenameProjectsTableToComponents.class) + .add(3115, "Add PROJECTS table", CreateProjectsTable.class) + .add(3116, "Populate PROJECTS table", PopulateProjectsTable.class) + ; } } diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/PopulateProjectsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/PopulateProjectsTable.java new file mode 100644 index 00000000000..c29204b7770 --- /dev/null +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/PopulateProjectsTable.java @@ -0,0 +1,62 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.server.platform.db.migration.version.v81; + +import java.sql.SQLException; +import org.sonar.api.utils.System2; +import org.sonar.db.Database; +import org.sonar.server.platform.db.migration.SupportsBlueGreen; +import org.sonar.server.platform.db.migration.step.DataChange; +import org.sonar.server.platform.db.migration.step.MassUpdate; + +@SupportsBlueGreen +public class PopulateProjectsTable extends DataChange { + private final System2 system; + + public PopulateProjectsTable(Database db, System2 system) { + super(db); + this.system = system; + } + + @Override + protected void execute(Context context) throws SQLException { + MassUpdate massUpdate = context.prepareMassUpdate(); + massUpdate.select("select p.uuid, p.kee, p.qualifier, p.organization_uuid, p.name, p.description, p.private, p.tags, p.created_at " + + "from components p " + + "left join projects np on np.uuid = p.uuid " + + "where p.scope = 'PRJ' and p.qualifier in ('TRK', 'APP') and np.uuid is null"); + massUpdate.rowPluralName("projects"); + massUpdate.update("insert into projects (uuid, kee, qualifier, organization_uuid, name, description, private, tags, created_at, updated_at) " + + "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + massUpdate.execute((row, update) -> { + update.setString(1, row.getString(1)); + update.setString(2, row.getString(2)); + update.setString(3, row.getString(3)); + update.setString(4, row.getString(4)); + update.setString(5, row.getNullableString(5)); + update.setString(6, row.getNullableString(6)); + update.setBoolean(7, row.getBoolean(7)); + update.setString(8, row.getNullableString(8)); + update.setLong(9, row.getDate(9).getTime()); + update.setLong(10, system.now()); + return true; + }); + } +} diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/RenameProjectsTableToComponents.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/RenameProjectsTableToComponents.java new file mode 100644 index 00000000000..e89b3ff27d1 --- /dev/null +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/RenameProjectsTableToComponents.java @@ -0,0 +1,35 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.server.platform.db.migration.version.v81; + +import java.sql.SQLException; +import org.sonar.db.Database; +import org.sonar.server.platform.db.migration.sql.RenameTableBuilder; +import org.sonar.server.platform.db.migration.step.DdlChange; + +public class RenameProjectsTableToComponents extends DdlChange { + public RenameProjectsTableToComponents(Database db) { + super(db); + } + + @Override public void execute(Context context) throws SQLException { + context.execute(new RenameTableBuilder(getDialect()).setName("projects").setNewName("components").build()); + } +} diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/CreateProjectsTableTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/CreateProjectsTableTest.java new file mode 100644 index 00000000000..3df07259c70 --- /dev/null +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/CreateProjectsTableTest.java @@ -0,0 +1,65 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.server.platform.db.migration.version.v81; + +import java.sql.SQLException; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.db.CoreDbTester; + +import static java.sql.Types.BIGINT; +import static java.sql.Types.BOOLEAN; +import static java.sql.Types.VARCHAR; +import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE; + +public class CreateProjectsTableTest { + private static final String TABLE_NAME = "projects"; + + @Rule + public CoreDbTester dbTester = CoreDbTester.createEmpty(); + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + private CreateProjectsTable underTest = new CreateProjectsTable(dbTester.database()); + + @Test + public void table_has_been_created() throws SQLException { + underTest.execute(); + + dbTester.assertTableExists(TABLE_NAME); + dbTester.assertPrimaryKey(TABLE_NAME, "pk_new_projects", "uuid"); + dbTester.assertUniqueIndex(TABLE_NAME, "uniq_projects_kee", "kee"); + + dbTester.assertColumnDefinition(TABLE_NAME, "uuid", VARCHAR, UUID_SIZE, false); + dbTester.assertColumnDefinition(TABLE_NAME, "kee", VARCHAR, 400, false); + dbTester.assertColumnDefinition(TABLE_NAME, "organization_uuid", VARCHAR, UUID_SIZE, false); + dbTester.assertColumnDefinition(TABLE_NAME, "name", VARCHAR, 2000, true); + dbTester.assertColumnDefinition(TABLE_NAME, "description", VARCHAR, 2000, true); + dbTester.assertColumnDefinition(TABLE_NAME, "private", BOOLEAN, null, false); + dbTester.assertColumnDefinition(TABLE_NAME, "tags", VARCHAR, 500, true); + dbTester.assertColumnDefinition(TABLE_NAME, "created_at", BIGINT, null, false); + dbTester.assertColumnDefinition(TABLE_NAME, "updated_at", BIGINT, null, false); + + // script should not fail if executed twice + underTest.execute(); + } +} diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/DbVersion81Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/DbVersion81Test.java index 46c2f39dfd8..c533f92f79c 100644 --- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/DbVersion81Test.java +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/DbVersion81Test.java @@ -36,7 +36,7 @@ public class DbVersion81Test { @Test public void verify_migration_count() { - verifyMigrationCount(underTest, 14); + verifyMigrationCount(underTest, 17); } } diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/PopulateProjectsTableTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/PopulateProjectsTableTest.java new file mode 100644 index 00000000000..d3a4d793a3d --- /dev/null +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/PopulateProjectsTableTest.java @@ -0,0 +1,122 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.server.platform.db.migration.version.v81; + +import java.sql.SQLException; +import java.util.Date; +import java.util.stream.Collectors; +import org.assertj.core.groups.Tuple; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.api.impl.utils.TestSystem2; +import org.sonar.api.utils.System2; +import org.sonar.db.CoreDbTester; +import org.sonar.server.platform.db.migration.step.DataChange; + +import static org.apache.commons.lang.math.RandomUtils.nextInt; +import static org.assertj.core.api.Assertions.assertThat; + +public class PopulateProjectsTableTest { + + private static final String TABLE_COMPONENTS = "components"; + private static final String TABLE_PROJECTS = "projects"; + private final static long PAST = 10_000_000_000L; + private static final long NOW = 50_000_000_000L; + private System2 system2 = new TestSystem2().setNow(NOW); + + @Rule + public CoreDbTester db = CoreDbTester.createForSchema(PopulateProjectsTableTest.class, "schema.sql"); + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + private DataChange underTest = new PopulateProjectsTable(db.database(), system2); + + @Before + public void setup() { + insertComponent("uuid-1", "PRJ", "TRK"); + insertComponent("uuid-2", "PRJ", "VW"); + insertComponent("uuid-3", "PRJ", "SVW"); + insertComponent("uuid-4", "PRJ", "APP"); + insertComponent("uuid-5", "PRJ", "TRK"); + insertComponent("uuid-6", "FIL", "FIL"); + } + + @Test + public void migrate() throws SQLException { + underTest.execute(); + + verifyMigrationResult(); + } + + @Test + public void migration_is_re_entrant() throws SQLException { + underTest.execute(); + underTest.execute(); + + verifyMigrationResult(); + } + + private void verifyMigrationResult() { + assertThat(db.countRowsOfTable(TABLE_COMPONENTS)).isEqualTo(6); + assertThat(db.countRowsOfTable(TABLE_PROJECTS)).isEqualTo(3); + + assertThat(db.select("select UUID, KEE, QUALIFIER, ORGANIZATION_UUID, NAME, DESCRIPTION, PRIVATE, TAGS, CREATED_AT, UPDATED_AT from " + TABLE_PROJECTS) + .stream() + .map(e -> new Tuple( + e.get("UUID"), + e.get("KEE"), + e.get("QUALIFIER"), + e.get("ORGANIZATION_UUID"), + e.get("NAME"), + e.get("DESCRIPTION"), + e.get("PRIVATE"), + e.get("TAGS"), + e.get("CREATED_AT"), + e.get("UPDATED_AT"))) + .collect(Collectors.toList())) + .containsExactlyInAnyOrder( + new Tuple("uuid-1", "uuid-1-key", "TRK", "default", "uuid-1-name", "uuid-1-description", false, "uuid-1-tags", PAST, 50_000_000_000L), + new Tuple("uuid-5", "uuid-5-key", "TRK", "default", "uuid-5-name", "uuid-5-description", false, "uuid-5-tags", PAST, 50_000_000_000L), + new Tuple("uuid-4", "uuid-4-key", "APP", "default", "uuid-4-name", "uuid-4-description", false, "uuid-4-tags", PAST, 50_000_000_000L)); + } + + private void insertComponent(String uuid, String scope, String qualifier) { + int id = nextInt(); + db.executeInsert("COMPONENTS", + "ID", id, + "NAME", uuid + "-name", + "DESCRIPTION", uuid + "-description", + "ORGANIZATION_UUID", "default", + "TAGS", uuid + "-tags", + "CREATED_AT", new Date(PAST), + "KEE", uuid + "-key", + "UUID", uuid, + "PROJECT_UUID", uuid, + "MAIN_BRANCH_PROJECT_UUID", uuid, + "UUID_PATH", ".", + "ROOT_UUID", uuid, + "PRIVATE", Boolean.toString(false), + "SCOPE", scope, + "QUALIFIER", qualifier); + } + +} diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/RenameProjectsTableToComponentsTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/RenameProjectsTableToComponentsTest.java new file mode 100644 index 00000000000..6b2b1995220 --- /dev/null +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/RenameProjectsTableToComponentsTest.java @@ -0,0 +1,68 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 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.server.platform.db.migration.version.v81; + +import java.sql.SQLException; +import java.util.Date; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.db.CoreDbTester; + +import static java.sql.Types.BIGINT; +import static java.sql.Types.BOOLEAN; +import static java.sql.Types.VARCHAR; +import static org.apache.commons.lang.math.RandomUtils.nextInt; +import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE; + +public class RenameProjectsTableToComponentsTest { + private static final String TABLE_NAME = "projects"; + private static final String NEW_TABLE_NAME = "components"; + + @Rule + public CoreDbTester dbTester = CoreDbTester.createForSchema(RenameProjectsTableToComponentsTest.class, "schema.sql"); + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + private CreateProjectsTable underTest = new CreateProjectsTable(dbTester.database()); + + @Test + public void table_has_been_renamed() throws SQLException { + + underTest.execute(); + + dbTester.assertTableExists(TABLE_NAME); + dbTester.assertPrimaryKey(TABLE_NAME, "pk_projects", "id"); + + dbTester.assertIndex(TABLE_NAME, "PROJECTS_ORGANIZATION", "organization_uuid"); + dbTester.assertUniqueIndex(TABLE_NAME, "PROJECTS_KEE", "kee"); + dbTester.assertIndex(TABLE_NAME, "PROJECTS_ROOT_UUID", "root_uuid"); + dbTester.assertUniqueIndex(TABLE_NAME, "PROJECTS_UUID", "uuid"); + dbTester.assertIndex(TABLE_NAME, "PROJECTS_PROJECT_UUID", "project_uuid"); + dbTester.assertIndex(TABLE_NAME, "PROJECTS_MODULE_UUID", "module_uuid"); + dbTester.assertIndex(TABLE_NAME, "PROJECTS_QUALIFIER", "qualifier"); + + underTest.execute(); + + dbTester.assertTableExists(TABLE_NAME); + } + +} diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v81/PopulateProjectsTableTest/schema.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v81/PopulateProjectsTableTest/schema.sql new file mode 100644 index 00000000000..b946b235b22 --- /dev/null +++ b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v81/PopulateProjectsTableTest/schema.sql @@ -0,0 +1,64 @@ +CREATE TABLE "COMPONENTS" ( + "ID" INTEGER NOT NULL AUTO_INCREMENT (1,1), + "ORGANIZATION_UUID" VARCHAR(40) NOT NULL, + "KEE" VARCHAR(400), + "UUID" VARCHAR(50) NOT NULL, + "UUID_PATH" VARCHAR(1500) NOT NULL, + "ROOT_UUID" VARCHAR(50) NOT NULL, + "PROJECT_UUID" VARCHAR(50) NOT NULL, + "MODULE_UUID" VARCHAR(50), + "MODULE_UUID_PATH" VARCHAR(1500), + "MAIN_BRANCH_PROJECT_UUID" VARCHAR(50), + "NAME" VARCHAR(2000), + "DESCRIPTION" VARCHAR(2000), + "PRIVATE" BOOLEAN NOT NULL, + "TAGS" VARCHAR(500), + "ENABLED" BOOLEAN NOT NULL DEFAULT TRUE, + "SCOPE" VARCHAR(3), + "QUALIFIER" VARCHAR(10), + "DEPRECATED_KEE" VARCHAR(400), + "PATH" VARCHAR(2000), + "LANGUAGE" VARCHAR(20), + "COPY_COMPONENT_UUID" VARCHAR(50), + "LONG_NAME" VARCHAR(2000), + "DEVELOPER_UUID" VARCHAR(50), + "CREATED_AT" TIMESTAMP, + "AUTHORIZATION_UPDATED_AT" BIGINT, + "B_CHANGED" BOOLEAN, + "B_COPY_COMPONENT_UUID" VARCHAR(50), + "B_DESCRIPTION" VARCHAR(2000), + "B_ENABLED" BOOLEAN, + "B_UUID_PATH" VARCHAR(1500), + "B_LANGUAGE" VARCHAR(20), + "B_LONG_NAME" VARCHAR(500), + "B_MODULE_UUID" VARCHAR(50), + "B_MODULE_UUID_PATH" VARCHAR(1500), + "B_NAME" VARCHAR(500), + "B_PATH" VARCHAR(2000), + "B_QUALIFIER" VARCHAR(10) +); +CREATE INDEX "PROJECTS_ORGANIZATION" ON "COMPONENTS" ("ORGANIZATION_UUID"); +CREATE UNIQUE INDEX "PROJECTS_KEE" ON "COMPONENTS" ("KEE"); +CREATE INDEX "PROJECTS_ROOT_UUID" ON "COMPONENTS" ("ROOT_UUID"); +CREATE UNIQUE INDEX "PROJECTS_UUID" ON "COMPONENTS" ("UUID"); +CREATE INDEX "PROJECTS_PROJECT_UUID" ON "COMPONENTS" ("PROJECT_UUID"); +CREATE INDEX "PROJECTS_MODULE_UUID" ON "COMPONENTS" ("MODULE_UUID"); +CREATE INDEX "PROJECTS_QUALIFIER" ON "COMPONENTS" ("QUALIFIER"); + +CREATE TABLE PROJECTS ( + UUID VARCHAR(40) PRIMARY KEY, + KEE VARCHAR(400) NOT NULL, + "QUALIFIER" VARCHAR(10) NOT NULL, + ORGANIZATION_UUID VARCHAR(40) NOT NULL, + NAME VARCHAR(2000), + DESCRIPTION VARCHAR(2000), + PRIVATE BOOLEAN NOT NULL, + TAGS VARCHAR(500), + CREATED_AT BIGINT NOT NULL, + UPDATED_AT BIGINT NOT NULL +); + +CREATE UNIQUE INDEX PK_PROJECTS ON PROJECTS(UUID); +CREATE UNIQUE INDEX UNIQ_PROJECTS ON PROJECTS(KEE); +CREATE INDEX IDX_QUALIFIER ON PROJECTS("QUALIFIER"); + diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v81/RenameProjectsTableToComponentsTest/schema.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v81/RenameProjectsTableToComponentsTest/schema.sql new file mode 100644 index 00000000000..310c9497f30 --- /dev/null +++ b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v81/RenameProjectsTableToComponentsTest/schema.sql @@ -0,0 +1,48 @@ +CREATE TABLE "PROJECTS" ( + "ID" INTEGER NOT NULL AUTO_INCREMENT (1,1), + "ORGANIZATION_UUID" VARCHAR(40) NOT NULL, + "KEE" VARCHAR(400), + "UUID" VARCHAR(50) NOT NULL, + "UUID_PATH" VARCHAR(1500) NOT NULL, + "ROOT_UUID" VARCHAR(50) NOT NULL, + "PROJECT_UUID" VARCHAR(50) NOT NULL, + "MODULE_UUID" VARCHAR(50), + "MODULE_UUID_PATH" VARCHAR(1500), + "MAIN_BRANCH_PROJECT_UUID" VARCHAR(50), + "NAME" VARCHAR(2000), + "DESCRIPTION" VARCHAR(2000), + "PRIVATE" BOOLEAN NOT NULL, + "TAGS" VARCHAR(500), + "ENABLED" BOOLEAN NOT NULL DEFAULT TRUE, + "SCOPE" VARCHAR(3), + "QUALIFIER" VARCHAR(10), + "DEPRECATED_KEE" VARCHAR(400), + "PATH" VARCHAR(2000), + "LANGUAGE" VARCHAR(20), + "COPY_COMPONENT_UUID" VARCHAR(50), + "LONG_NAME" VARCHAR(2000), + "DEVELOPER_UUID" VARCHAR(50), + "CREATED_AT" TIMESTAMP, + "AUTHORIZATION_UPDATED_AT" BIGINT, + "B_CHANGED" BOOLEAN, + "B_COPY_COMPONENT_UUID" VARCHAR(50), + "B_DESCRIPTION" VARCHAR(2000), + "B_ENABLED" BOOLEAN, + "B_UUID_PATH" VARCHAR(1500), + "B_LANGUAGE" VARCHAR(20), + "B_LONG_NAME" VARCHAR(500), + "B_MODULE_UUID" VARCHAR(50), + "B_MODULE_UUID_PATH" VARCHAR(1500), + "B_NAME" VARCHAR(500), + "B_PATH" VARCHAR(2000), + "B_QUALIFIER" VARCHAR(10) +); +ALTER TABLE "PROJECTS" ADD CONSTRAINT "PK_PROJECTS" PRIMARY KEY("ID"); + +CREATE INDEX "PROJECTS_ORGANIZATION" ON "PROJECTS" ("ORGANIZATION_UUID"); +CREATE UNIQUE INDEX "PROJECTS_KEE" ON "PROJECTS" ("KEE"); +CREATE INDEX "PROJECTS_ROOT_UUID" ON "PROJECTS" ("ROOT_UUID"); +CREATE UNIQUE INDEX "PROJECTS_UUID" ON "PROJECTS" ("UUID"); +CREATE INDEX "PROJECTS_PROJECT_UUID" ON "PROJECTS" ("PROJECT_UUID"); +CREATE INDEX "PROJECTS_MODULE_UUID" ON "PROJECTS" ("MODULE_UUID"); +CREATE INDEX "PROJECTS_QUALIFIER" ON "PROJECTS" ("QUALIFIER"); diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/es/ProjectIndexers.java b/server/sonar-server-common/src/main/java/org/sonar/server/es/ProjectIndexers.java index 55422b72f3a..51e5b721d31 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/es/ProjectIndexers.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/es/ProjectIndexers.java @@ -20,9 +20,12 @@ package org.sonar.server.es; import java.util.Collection; +import java.util.stream.Collectors; import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.DbSession; +import org.sonar.db.component.BranchDto; import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; public interface ProjectIndexers { @@ -40,4 +43,25 @@ public interface ProjectIndexers { .collect(MoreCollectors.toSet(projectOrModules.size())); commitAndIndexByProjectUuids(dbSession, projectUuids, cause); } + + default void commitAndIndexProjects(DbSession dbSession, Collection<ProjectDto> projects, ProjectIndexer.Cause cause) { + Collection<String> projectUuids = projects.stream() + .map(ProjectDto::getUuid) + .collect(MoreCollectors.toSet(projects.size())); + commitAndIndexByProjectUuids(dbSession, projectUuids, cause); + } + + default void commitAndIndexComponents(DbSession dbSession, Collection<ComponentDto> projects, ProjectIndexer.Cause cause) { + Collection<String> projectUuids = projects.stream() + .map(ComponentDto::uuid) + .collect(MoreCollectors.toSet(projects.size())); + commitAndIndexByProjectUuids(dbSession, projectUuids, cause); + } + + default void commitAndIndexBranches(DbSession dbSession, Collection<BranchDto> branches, ProjectIndexer.Cause cause) { + Collection<String> branchUuids = branches.stream() + .map(BranchDto::getUuid) + .collect(Collectors.toList()); + commitAndIndexByProjectUuids(dbSession, branchUuids, cause); + } } diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java index d3ffeb07751..0a6b6f0ae06 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java @@ -85,7 +85,7 @@ class IssueIteratorForSingleChunk implements IssueIterator { private static final String SQL_ALL = "select " + StringUtils.join(FIELDS, ",") + " from issues i " + "inner join rules r on r.id = i.rule_id " + - "inner join projects c on c.uuid = i.component_uuid "; + "inner join components c on c.uuid = i.component_uuid "; private static final String PROJECT_FILTER = " and c.project_uuid = ? and i.project_uuid = ? "; private static final String ISSUE_KEY_FILTER_PREFIX = " and i.kee in ("; diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndexer.java b/server/sonar-server-common/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndexer.java index 08cae9b4cb7..113b45d8c1d 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndexer.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndexer.java @@ -138,8 +138,7 @@ public class ProjectMeasuresIndexer implements ProjectIndexer, NeedAuthorization } } - // the remaining uuids reference projects that don't exist in db. They must - // be deleted from index. + // the remaining uuids reference projects that don't exist in db. They must be deleted from index. projectUuids.forEach(projectUuid -> bulkIndexer.addDeletion(TYPE_PROJECT_MEASURES, projectUuid, AuthorizationDoc.idOf(projectUuid))); return bulkIndexer.stop(); diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/project/Project.java b/server/sonar-server-common/src/main/java/org/sonar/server/project/Project.java index fd5b4f307b1..9c45cdbed32 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/project/Project.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/project/Project.java @@ -24,6 +24,7 @@ import java.util.Objects; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; @Immutable public class Project { @@ -46,6 +47,10 @@ public class Project { return new Project(project.uuid(), project.getKey(), project.name(), project.description(), project.getTags()); } + public static Project from(ProjectDto project) { + return new Project(project.getUuid(), project.getKey(), project.getName(), project.getDescription(), project.getTags()); + } + /** * Always links to a row that exists in database. */ diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/qualitygate/QualityGateFinder.java b/server/sonar-server-common/src/main/java/org/sonar/server/qualitygate/QualityGateFinder.java index 3d0fa1c859b..0aad74591a1 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/qualitygate/QualityGateFinder.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/qualitygate/QualityGateFinder.java @@ -22,8 +22,8 @@ package org.sonar.server.qualitygate; import java.util.Optional; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateDto; @@ -43,8 +43,12 @@ public class QualityGateFinder { * * It will first try to get the quality gate explicitly defined on a project, if none it will try to return default quality gate of the organization */ - public Optional<QualityGateData> getQualityGate(DbSession dbSession, OrganizationDto organization, ComponentDto component) { - Optional<QualityGateData> res = dbClient.projectQgateAssociationDao().selectQGateUuidByComponentUuid(dbSession, component.uuid()) + public Optional<QualityGateData> getQualityGate(DbSession dbSession, OrganizationDto organization, ProjectDto projectDto) { + return getQualityGate(dbSession, organization, projectDto.getUuid()); + } + + public Optional<QualityGateData> getQualityGate(DbSession dbSession, OrganizationDto organization, String projectUuid) { + Optional<QualityGateData> res = dbClient.projectQgateAssociationDao().selectQGateUuidByProjectUuid(dbSession, projectUuid) .map(qualityGateUuid -> dbClient.qualityGateDao().selectByUuid(dbSession, qualityGateUuid)) .map(qualityGateDto -> new QualityGateData(qualityGateDto, false)); if (res.isPresent()) { diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/webhook/WebHooks.java b/server/sonar-server-common/src/main/java/org/sonar/server/webhook/WebHooks.java index dbed990eb35..469a8415ec7 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/webhook/WebHooks.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/webhook/WebHooks.java @@ -25,7 +25,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.sonar.api.ce.posttask.PostProjectAnalysisTask; import org.sonar.api.config.Configuration; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import static java.util.Objects.requireNonNull; @@ -38,7 +38,7 @@ public interface WebHooks { * This can be used to not do consuming operations before calling * {@link #sendProjectAnalysisUpdate(Analysis, Supplier, PostProjectAnalysisTask.LogStatistics)} */ - boolean isEnabled(ComponentDto projectDto); + boolean isEnabled(ProjectDto projectDto); /** * Calls all WebHooks configured in the specified {@link Configuration} for the specified analysis with the @@ -56,7 +56,7 @@ public interface WebHooks { private final String ceTaskUuid; private final String analysisUuid; - public Analysis(String projectUuid, @Nullable String analysisUuid, @Nullable String ceTaskUuid) { + public Analysis(String projectUuid, @Nullable String analysisUuid, @Nullable String ceTaskUuid) { this.projectUuid = requireNonNull(projectUuid, "projectUuid can't be null"); this.analysisUuid = analysisUuid; this.ceTaskUuid = ceTaskUuid; diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/webhook/WebHooksImpl.java b/server/sonar-server-common/src/main/java/org/sonar/server/webhook/WebHooksImpl.java index b3c42e70a7c..eaf75b12497 100644 --- a/server/sonar-server-common/src/main/java/org/sonar/server/webhook/WebHooksImpl.java +++ b/server/sonar-server-common/src/main/java/org/sonar/server/webhook/WebHooksImpl.java @@ -33,7 +33,7 @@ import org.sonar.api.utils.log.Loggers; import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDao; import org.sonar.db.webhook.WebhookDto; import org.sonar.server.async.AsyncExecution; @@ -59,8 +59,8 @@ public class WebHooksImpl implements WebHooks { } @Override - public boolean isEnabled(ComponentDto projectDto) { - return readWebHooksFrom(projectDto.uuid(), null) + public boolean isEnabled(ProjectDto projectDto) { + return readWebHooksFrom(projectDto.getUuid(), null) .findAny() .isPresent(); } @@ -68,17 +68,12 @@ public class WebHooksImpl implements WebHooks { private Stream<WebhookDto> readWebHooksFrom(String projectUuid, @CheckForNull PostProjectAnalysisTask.LogStatistics taskLogStatistics) { try (DbSession dbSession = dbClient.openSession(false)) { - Optional<ComponentDto> optionalComponentDto = dbClient.componentDao().selectByUuid(dbSession, projectUuid); - ComponentDto componentDto = checkStateWithOptional(optionalComponentDto, "the requested project '%s' was not found", projectUuid); - - if (componentDto.getMainBranchProjectUuid() != null && !componentDto.uuid().equals(componentDto.getMainBranchProjectUuid())) { - Optional<ComponentDto> mainBranchComponentDto = dbClient.componentDao().selectByUuid(dbSession, componentDto.getMainBranchProjectUuid()); - componentDto = checkStateWithOptional(mainBranchComponentDto, "the requested project '%s' was not found", projectUuid); - } + Optional<ProjectDto> optionalProjectDto = dbClient.projectDao().selectByUuid(dbSession, projectUuid); + ProjectDto projectDto = checkStateWithOptional(optionalProjectDto, "the requested project '%s' was not found", projectUuid); WebhookDao dao = dbClient.webhookDao(); - List<WebhookDto> projectWebhooks = dao.selectByProject(dbSession, componentDto); - List<WebhookDto> organizationWebhooks = dao.selectByOrganizationUuid(dbSession, componentDto.getOrganizationUuid()); + List<WebhookDto> projectWebhooks = dao.selectByProject(dbSession, projectDto); + List<WebhookDto> organizationWebhooks = dao.selectByOrganizationUuid(dbSession, projectDto.getOrganizationUuid()); if (taskLogStatistics != null) { taskLogStatistics.add("globalWebhooks", organizationWebhooks.size()); taskLogStatistics.add("projectWebhooks", projectWebhooks.size()); diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexerTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexerTest.java index 807bfaae78f..f547363413d 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexerTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexerTest.java @@ -142,7 +142,10 @@ public class ProjectMeasuresIndexerTest { assertThatProjectHasTag(project, "foo"); project.setTagsString("bar"); + // TODO this should be removed at some point db.getDbClient().componentDao().updateTags(db.getSession(), project); + db.getDbClient().projectDao().updateTags(db.getSession(), db.components().getProjectDto(project).setTagsString("bar")); + IndexingResult result = indexProject(project, PROJECT_TAGS_UPDATE); assertThatProjectHasTag(project, "bar"); @@ -156,7 +159,7 @@ public class ProjectMeasuresIndexerTest { indexProject(project, PROJECT_CREATION); assertThatIndexContainsOnly(project); - db.getDbClient().componentDao().delete(db.getSession(), project.getId()); + db.getDbClient().purgeDao().deleteProject(db.getSession(), project.uuid()); IndexingResult result = indexProject(project, PROJECT_DELETION); assertThat(es.countDocuments(TYPE_PROJECT_MEASURES)).isEqualTo(0); diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/qualitygate/QualityGateFinderTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/qualitygate/QualityGateFinderTest.java index bbc485bba1a..2b90eadeb82 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/qualitygate/QualityGateFinderTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/qualitygate/QualityGateFinderTest.java @@ -26,7 +26,7 @@ import org.junit.rules.ExpectedException; import org.sonar.api.utils.System2; import org.sonar.db.DbSession; import org.sonar.db.DbTester; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QualityGateDto; import static java.lang.String.format; @@ -46,7 +46,7 @@ public class QualityGateFinderTest { @Test public void return_default_quality_gate_for_project() { - ComponentDto project = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); QualityGateDto dbQualityGate = db.qualityGates().createDefaultQualityGate(db.getDefaultOrganization(), qg -> qg.setName("Sonar way")); Optional<QualityGateFinder.QualityGateData> result = underTest.getQualityGate(dbSession, db.getDefaultOrganization(), project); @@ -58,8 +58,8 @@ public class QualityGateFinderTest { @Test public void return_project_quality_gate_over_default() { - ComponentDto project = db.components().insertPrivateProject(); - db.qualityGates().createDefaultQualityGate(db.getDefaultOrganization(),qg -> qg.setName("Sonar way")); + ProjectDto project = db.components().insertPrivateProjectDto(); + db.qualityGates().createDefaultQualityGate(db.getDefaultOrganization(), qg -> qg.setName("Sonar way")); QualityGateDto dbQualityGate = db.qualityGates().insertQualityGate(db.getDefaultOrganization(), qg -> qg.setName("My team QG")); db.qualityGates().associateProjectToQualityGate(project, dbQualityGate); @@ -72,7 +72,7 @@ public class QualityGateFinderTest { @Test public void fail_when_default_qgate_defined_does_not_exists() { - ComponentDto project = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); QualityGateDto dbQualityGate = db.qualityGates().createDefaultQualityGate(db.getDefaultOrganization(), qg -> qg.setName("Sonar way")); db.getDbClient().qualityGateDao().delete(dbQualityGate, dbSession); db.commit(); @@ -82,7 +82,7 @@ public class QualityGateFinderTest { @Test public void fail_when_project_qgate_defined_does_not_exists() { - ComponentDto project = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); QualityGateDto dbQualityGate = db.qualityGates().insertQualityGate(db.getDefaultOrganization(), qg -> qg.setName("My team QG")); db.qualityGates().associateProjectToQualityGate(project, dbQualityGate); db.getDbClient().qualityGateDao().delete(dbQualityGate, dbSession); diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/view/index/ViewIndexerTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/view/index/ViewIndexerTest.java index 496b53519cf..9ab7c12bf30 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/view/index/ViewIndexerTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/view/index/ViewIndexerTest.java @@ -168,7 +168,7 @@ public class ViewIndexerTest { @Test public void index_application_branch() { - ComponentDto application = db.components().insertMainBranch(c -> c.setQualifier(APP).setDbKey("app")); + ComponentDto application = db.components().insertPublicProject(c -> c.setQualifier(APP).setDbKey("app")); ComponentDto applicationBranch1 = db.components().insertProjectBranch(application, a -> a.setKey("app-branch1")); ComponentDto applicationBranch2 = db.components().insertProjectBranch(application, a -> a.setKey("app-branch2")); ComponentDto project1 = db.components().insertPrivateProject(p -> p.setDbKey("prj1")); diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/webhook/SynchronousWebHooksImplTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/webhook/SynchronousWebHooksImplTest.java index b7e90bf3f66..52ac0374bac 100644 --- a/server/sonar-server-common/src/test/java/org/sonar/server/webhook/SynchronousWebHooksImplTest.java +++ b/server/sonar-server-common/src/test/java/org/sonar/server/webhook/SynchronousWebHooksImplTest.java @@ -30,6 +30,7 @@ import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDbTester; import org.sonar.server.async.AsyncExecution; import org.sonar.server.organization.DefaultOrganizationProvider; @@ -70,26 +71,25 @@ public class SynchronousWebHooksImplTest { @Test public void isEnabled_returns_false_if_no_webhooks() { - ComponentDto componentDto = componentDbTester.insertPrivateProject(); - - assertThat(underTest.isEnabled(componentDto)).isFalse(); + ProjectDto projectDto = componentDbTester.insertPrivateProjectDto(); + assertThat(underTest.isEnabled(projectDto)).isFalse(); } @Test public void isEnabled_returns_true_if_one_valid_global_webhook() { - ComponentDto componentDto = componentDbTester.insertPrivateProject(); - webhookDbTester.insert(newWebhook(componentDto).setName("First").setUrl("http://url1")); + ProjectDto projectDto = componentDbTester.insertPrivateProjectDto(); + webhookDbTester.insert(newWebhook(projectDto).setName("First").setUrl("http://url1")); - assertThat(underTest.isEnabled(componentDto)).isTrue(); + assertThat(underTest.isEnabled(projectDto)).isTrue(); } @Test public void isEnabled_returns_true_if_one_valid_project_webhook() { String organizationUuid = defaultOrganizationProvider.get().getUuid(); - ComponentDto componentDto = componentDbTester.insertPrivateProject().setOrganizationUuid(organizationUuid); - webhookDbTester.insert(newWebhook(componentDto).setName("First").setUrl("http://url1")); + ProjectDto projectDto = componentDbTester.insertPrivateProjectDto().setOrganizationUuid(organizationUuid); + webhookDbTester.insert(newWebhook(projectDto).setName("First").setUrl("http://url1")); - assertThat(underTest.isEnabled(componentDto)).isTrue(); + assertThat(underTest.isEnabled(projectDto)).isTrue(); } @Test @@ -137,25 +137,25 @@ public class SynchronousWebHooksImplTest { @Test public void send_project_webhooks() { String organizationUuid = defaultOrganizationProvider.get().getUuid(); - ComponentDto componentDto = componentDbTester.insertPrivateProject().setOrganizationUuid(organizationUuid); - webhookDbTester.insert(newWebhook(componentDto).setName("First").setUrl("http://url1")); + ProjectDto projectDto = componentDbTester.insertPrivateProjectDto().setOrganizationUuid(organizationUuid); + webhookDbTester.insert(newWebhook(projectDto).setName("First").setUrl("http://url1")); caller.enqueueSuccess(NOW, 200, 1_234); - underTest.sendProjectAnalysisUpdate(new WebHooks.Analysis(componentDto.uuid(), "1", "#1"), () -> mock, taskStatistics); + underTest.sendProjectAnalysisUpdate(new WebHooks.Analysis(projectDto.getUuid(), "1", "#1"), () -> mock, taskStatistics); assertThat(caller.countSent()).isEqualTo(1); assertThat(logTester.logs(DEBUG)).contains("Sent webhook 'First' | url=http://url1 | time=1234ms | status=200"); verify(deliveryStorage).persist(any(WebhookDelivery.class)); - verify(deliveryStorage).purge(componentDto.uuid()); + verify(deliveryStorage).purge(projectDto.getUuid()); verifyLogStatistics(0, 1); } @Test public void send_global_and_project_webhooks() { OrganizationDto organizationDto = db.organizations().insert(); - ComponentDto componentDto = componentDbTester.insertPrivateProject(organizationDto); - webhookDbTester.insert(newWebhook(componentDto).setName("1First").setUrl("http://url1")); - webhookDbTester.insert(newWebhook(componentDto).setName("2Second").setUrl("http://url2")); + ProjectDto projectDto = componentDbTester.insertPrivateProjectDto(organizationDto); + webhookDbTester.insert(newWebhook(projectDto).setName("1First").setUrl("http://url1")); + webhookDbTester.insert(newWebhook(projectDto).setName("2Second").setUrl("http://url2")); webhookDbTester.insert(newWebhook(organizationDto).setName("3Third").setUrl("http://url3")); webhookDbTester.insert(newWebhook(organizationDto).setName("4Fourth").setUrl("http://url4")); webhookDbTester.insert(newWebhook(organizationDto).setName("5Fifth").setUrl("http://url5")); @@ -165,7 +165,7 @@ public class SynchronousWebHooksImplTest { caller.enqueueSuccess(NOW, 200, 5_678); caller.enqueueSuccess(NOW, 200, 9_256); - underTest.sendProjectAnalysisUpdate(new WebHooks.Analysis(componentDto.uuid(), "1", "#1"), () -> mock, taskStatistics); + underTest.sendProjectAnalysisUpdate(new WebHooks.Analysis(projectDto.getUuid(), "1", "#1"), () -> mock, taskStatistics); assertThat(caller.countSent()).isEqualTo(5); List<String> debugLogs = logTester.logs(DEBUG); @@ -175,7 +175,7 @@ public class SynchronousWebHooksImplTest { assertThat(debugLogs).contains("Sent webhook '4Fourth' | url=http://url4 | time=5678ms | status=200"); assertThat(debugLogs).contains("Sent webhook '5Fifth' | url=http://url5 | time=9256ms | status=200"); verify(deliveryStorage, times(5)).persist(any(WebhookDelivery.class)); - verify(deliveryStorage).purge(componentDto.uuid()); + verify(deliveryStorage).purge(projectDto.getUuid()); verifyLogStatistics(3, 2); } diff --git a/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEvent.java b/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEvent.java index c962f205761..c0c72be8430 100644 --- a/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEvent.java +++ b/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEvent.java @@ -26,22 +26,22 @@ import javax.annotation.concurrent.Immutable; import org.sonar.api.config.Configuration; import org.sonar.api.measures.Metric; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; import org.sonar.db.component.SnapshotDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.qualitygate.EvaluatedQualityGate; import static java.util.Objects.requireNonNull; @Immutable public class QGChangeEvent { - private final ComponentDto project; + private final ProjectDto project; private final BranchDto branch; private final SnapshotDto analysis; private final Configuration projectConfiguration; private final Metric.Level previousStatus; private final Supplier<Optional<EvaluatedQualityGate>> qualityGateSupplier; - public QGChangeEvent(ComponentDto project, BranchDto branch, SnapshotDto analysis, Configuration projectConfiguration, + public QGChangeEvent(ProjectDto project, BranchDto branch, SnapshotDto analysis, Configuration projectConfiguration, @Nullable Metric.Level previousStatus, Supplier<Optional<EvaluatedQualityGate>> qualityGateSupplier) { this.project = requireNonNull(project, "project can't be null"); this.branch = requireNonNull(branch, "branch can't be null"); @@ -55,7 +55,7 @@ public class QGChangeEvent { return branch; } - public ComponentDto getProject() { + public ProjectDto getProject() { return project; } @@ -87,8 +87,8 @@ public class QGChangeEvent { '}'; } - private static String toString(ComponentDto project) { - return project.uuid() + ":" + project.getKey(); + private static String toString(ProjectDto project) { + return project.getUuid() + ":" + project.getKey(); } private static String toString(BranchDto branch) { diff --git a/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImpl.java b/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImpl.java index 71ab6cbd0eb..5560978c528 100644 --- a/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImpl.java +++ b/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImpl.java @@ -20,7 +20,6 @@ package org.sonar.server.qualitygate.changeevent; import com.google.common.collect.Multimap; -import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Objects; @@ -66,23 +65,23 @@ public class QGChangeEventListenersImpl implements QGChangeEventListeners { } try { - Multimap<String, QGChangeEvent> eventsByComponentUuid = changeEvents.stream() - .collect(MoreCollectors.index(t -> t.getProject().uuid())); - Multimap<String, DefaultIssue> issueByComponentUuid = issues.stream() + Multimap<String, QGChangeEvent> eventsByBranchUuid = changeEvents.stream() + .collect(MoreCollectors.index(t -> t.getBranch().getUuid())); + Multimap<String, DefaultIssue> issueByBranchUuid = issues.stream() .collect(MoreCollectors.index(DefaultIssue::projectUuid)); - issueByComponentUuid.asMap() - .forEach((componentUuid, value) -> { - Collection<QGChangeEvent> qgChangeEvents = eventsByComponentUuid.get(componentUuid); - if (!qgChangeEvents.isEmpty()) { - Set<ChangedIssue> changedIssues = value.stream() - .map(ChangedIssueImpl::new) - .collect(toSet()); - qgChangeEvents - .forEach(changeEvent -> Arrays.stream(listeners) - .forEach(listener -> broadcastTo(changedIssues, changeEvent, listener))); + issueByBranchUuid.asMap().forEach((branchUuid, branchIssues) -> { + Collection<QGChangeEvent> qgChangeEvents = eventsByBranchUuid.get(branchUuid); + if (qgChangeEvents.isEmpty()) { + return; + } + Set<ChangedIssue> changedIssues = branchIssues.stream().map(ChangedIssueImpl::new).collect(toSet()); + for (QGChangeEvent changeEvent : qgChangeEvents) { + for (QGChangeEventListener listener : listeners) { + broadcastTo(changedIssues, changeEvent, listener); } - }); + } + }); } catch (Error e) { LOG.warn(format("Broadcasting to listeners failed for %s events", changeEvents.size()), e); } diff --git a/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImplTest.java b/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImplTest.java index b03d7416b87..7b52cae8716 100644 --- a/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImplTest.java +++ b/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImplTest.java @@ -41,7 +41,7 @@ import org.sonar.api.rules.RuleType; import org.sonar.api.utils.log.LogTester; import org.sonar.api.utils.log.LoggerLevel; import org.sonar.core.issue.DefaultIssue; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.component.BranchDto; import org.sonar.server.qualitygate.changeevent.QGChangeEventListener.ChangedIssue; import org.sonar.server.qualitygate.changeevent.QGChangeEventListenersImpl.ChangedIssueImpl; @@ -69,11 +69,11 @@ public class QGChangeEventListenersImplTest { private QGChangeEventListener listener3 = mock(QGChangeEventListener.class); private List<QGChangeEventListener> listeners = Arrays.asList(listener1, listener2, listener3); - private String component1Uuid = RandomStringUtils.randomAlphabetic(6); - private ComponentDto component1 = newComponentDto(component1Uuid); - private DefaultIssue component1Issue = newDefaultIssue(component1Uuid); + private String project1Uuid = RandomStringUtils.randomAlphabetic(6); + private BranchDto project1 = newBranchDto(project1Uuid); + private DefaultIssue component1Issue = newDefaultIssue(project1Uuid); private List<DefaultIssue> oneIssueOnComponent1 = singletonList(component1Issue); - private QGChangeEvent component1QGChangeEvent = newQGChangeEvent(component1); + private QGChangeEvent component1QGChangeEvent = newQGChangeEvent(project1); private InOrder inOrder = Mockito.inOrder(listener1, listener2, listener3); @@ -176,24 +176,24 @@ public class QGChangeEventListenersImplTest { @Test public void broadcastOnIssueChange_calls_listener_for_each_component_uuid_with_at_least_one_QGChangeEvent() { - // component2 has multiple issues - ComponentDto component2 = newComponentDto(component1Uuid + "2"); - DefaultIssue[] component2Issues = {newDefaultIssue(component2.uuid()), newDefaultIssue(component2.uuid())}; + // branch has multiple issues + BranchDto component2 = newBranchDto(project1Uuid + "2"); + DefaultIssue[] component2Issues = {newDefaultIssue(component2.getUuid()), newDefaultIssue(component2.getUuid())}; QGChangeEvent component2QGChangeEvent = newQGChangeEvent(component2); - // component 3 has multiple QGChangeEvent and only one issue - ComponentDto component3 = newComponentDto(component1Uuid + "3"); - DefaultIssue component3Issue = newDefaultIssue(component3.uuid()); + // branch 3 has multiple QGChangeEvent and only one issue + BranchDto component3 = newBranchDto(project1Uuid + "3"); + DefaultIssue component3Issue = newDefaultIssue(component3.getUuid()); QGChangeEvent[] component3QGChangeEvents = {newQGChangeEvent(component3), newQGChangeEvent(component3)}; - // component 4 has multiple QGChangeEvent and multiples issues - ComponentDto component4 = newComponentDto(component1Uuid + "4"); - DefaultIssue[] component4Issues = {newDefaultIssue(component4.uuid()), newDefaultIssue(component4.uuid())}; + // branch 4 has multiple QGChangeEvent and multiples issues + BranchDto component4 = newBranchDto(project1Uuid + "4"); + DefaultIssue[] component4Issues = {newDefaultIssue(component4.getUuid()), newDefaultIssue(component4.getUuid())}; QGChangeEvent[] component4QGChangeEvents = {newQGChangeEvent(component4), newQGChangeEvent(component4)}; - // component 5 has no QGChangeEvent but one issue - ComponentDto component5 = newComponentDto(component1Uuid + "5"); - DefaultIssue component5Issue = newDefaultIssue(component5.uuid()); + // branch 5 has no QGChangeEvent but one issue + BranchDto component5 = newBranchDto(project1Uuid + "5"); + DefaultIssue component5Issue = newDefaultIssue(component5.getUuid()); List<DefaultIssue> issues = Stream.of( Stream.of(component1Issue), @@ -331,15 +331,15 @@ public class QGChangeEventListenersImplTest { } } - private static ComponentDto newComponentDto(String uuid) { - ComponentDto componentDto = new ComponentDto(); - componentDto.setUuid(uuid); - return componentDto; + private static BranchDto newBranchDto(String uuid) { + BranchDto branchDto = new BranchDto(); + branchDto.setUuid(uuid); + return branchDto; } - private static QGChangeEvent newQGChangeEvent(ComponentDto componentDto) { + private static QGChangeEvent newQGChangeEvent(BranchDto branch) { QGChangeEvent res = mock(QGChangeEvent.class); - when(res.getProject()).thenReturn(componentDto); + when(res.getBranch()).thenReturn(branch); return res; } diff --git a/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventTest.java b/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventTest.java index d882ff7a60a..9ae63c2b073 100644 --- a/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventTest.java +++ b/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventTest.java @@ -30,8 +30,8 @@ import org.sonar.api.config.Configuration; import org.sonar.api.measures.Metric; 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.project.ProjectDto; import org.sonar.server.qualitygate.EvaluatedQualityGate; import static org.assertj.core.api.Assertions.assertThat; @@ -40,8 +40,8 @@ public class QGChangeEventTest { @Rule public ExpectedException expectedException = ExpectedException.none(); - private ComponentDto project = new ComponentDto() - .setDbKey("foo") + private ProjectDto project = new ProjectDto() + .setKey("foo") .setUuid("bar"); private BranchDto branch = new BranchDto() .setBranchType(BranchType.BRANCH) diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java index 5689072bc1c..8ba3e53e1fc 100644 --- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java +++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java @@ -32,6 +32,7 @@ import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.db.user.UserDto; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.UnauthorizedException; @@ -98,6 +99,14 @@ public abstract class AbstractUserSession implements UserSession { } @Override + public final boolean hasProjectPermission(String permission, ProjectDto project) { + if (isRoot()) { + return true; + } + return hasProjectUuidPermission(permission, project.getUuid()); + } + + @Override public final boolean hasComponentUuidPermission(String permission, String componentUuid) { if (isRoot()) { return true; @@ -127,6 +136,24 @@ public abstract class AbstractUserSession implements UserSession { return doKeepAuthorizedComponents(permission, components); } + @Override + public List<ProjectDto> keepAuthorizedProjects(String permission, Collection<ProjectDto> projects) { + if (isRoot()) { + return new ArrayList<>(projects); + } + return doKeepAuthorizedProjects(permission, projects); + } + + /** + * Naive implementation, to be overridden if needed + */ + protected List<ProjectDto> doKeepAuthorizedProjects(String permission, Collection<ProjectDto> projects) { + boolean allowPublicComponent = PUBLIC_PERMISSIONS.contains(permission); + return projects.stream() + .filter(c -> (allowPublicComponent && !c.isPrivate()) || hasProjectPermission(permission, c)) + .collect(MoreCollectors.toList()); + } + /** * Naive implementation, to be overridden if needed */ @@ -174,6 +201,14 @@ public abstract class AbstractUserSession implements UserSession { return this; } + @Override public UserSession checkProjectPermission(String projectPermission, ProjectDto project) { + if (isRoot() || hasProjectUuidPermission(projectPermission, project.getUuid())) { + return this; + } + + throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE); + } + @Override public final UserSession checkComponentUuidPermission(String permission, String componentUuid) { if (!hasComponentUuidPermission(permission, componentUuid)) { diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java index 1fbbe17116f..c62055870d6 100644 --- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java +++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java @@ -183,6 +183,9 @@ public class ServerUserSession extends AbstractUserSession { return permissions.contains(permission); } + /** + * Also applies to views + */ private Set<String> loadProjectPermissions(String projectUuid) { try (DbSession dbSession = dbClient.openSession(false)) { Optional<ComponentDto> component = dbClient.componentDao().selectByUuid(dbSession, projectUuid); diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java index 771a434cc23..d310e17dd1c 100644 --- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java +++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java @@ -26,6 +26,7 @@ import javax.annotation.CheckForNull; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.db.user.GroupDto; import org.sonar.server.exceptions.UnauthorizedException; @@ -134,6 +135,12 @@ public class ThreadLocalUserSession implements UserSession { } @Override + public UserSession checkProjectPermission(String projectPermission, ProjectDto project) { + get().checkProjectPermission(projectPermission, project); + return this; + } + + @Override public UserSession checkComponentUuidPermission(String permission, String componentUuid) { get().checkComponentUuidPermission(permission, componentUuid); return this; @@ -155,6 +162,10 @@ public class ThreadLocalUserSession implements UserSession { return get().hasComponentPermission(permission, component); } + @Override public boolean hasProjectPermission(String permission, ProjectDto project) { + return get().hasProjectPermission(permission, project); + } + @Override public boolean hasComponentUuidPermission(String permission, String componentUuid) { return get().hasComponentUuidPermission(permission, componentUuid); @@ -176,6 +187,10 @@ public class ThreadLocalUserSession implements UserSession { return get().keepAuthorizedComponents(permission, components); } + @Override public List<ProjectDto> keepAuthorizedProjects(String permission, Collection<ProjectDto> projects) { + return get().keepAuthorizedProjects(permission, projects); + } + @Override public boolean hasMembership(OrganizationDto organizationDto) { return get().hasMembership(organizationDto); diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java index 7fb907e4b9b..6c160f26a71 100644 --- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java +++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java @@ -29,6 +29,7 @@ import javax.annotation.concurrent.Immutable; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.db.user.GroupDto; import static java.util.Objects.requireNonNull; @@ -98,8 +99,7 @@ public interface UserSession { */ Optional<IdentityProvider> getIdentityProvider(); - @Immutable - final class ExternalIdentity { + @Immutable final class ExternalIdentity { private final String id; private final String login; @@ -206,6 +206,8 @@ public interface UserSession { */ boolean hasComponentPermission(String permission, ComponentDto component); + boolean hasProjectPermission(String permission, ProjectDto project); + /** * Using {@link #hasComponentPermission(String, ComponentDto)} is recommended * because it does not have to load project if the referenced component @@ -225,6 +227,7 @@ public interface UserSession { */ List<ComponentDto> keepAuthorizedComponents(String permission, Collection<ComponentDto> components); + List<ProjectDto> keepAuthorizedProjects(String permission, Collection<ProjectDto> projects); /** * Ensures that {@link #hasComponentPermission(String, ComponentDto)} is {@code true}, * otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}. @@ -232,6 +235,12 @@ public interface UserSession { UserSession checkComponentPermission(String projectPermission, ComponentDto component); /** + * Ensures that {@link #hasProjectPermission(String, ProjectDto)} is {@code true}, + * otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}. + */ + UserSession checkProjectPermission(String projectPermission, ProjectDto project); + + /** * Ensures that {@link #hasComponentUuidPermission(String, String)} is {@code true}, * otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}. * diff --git a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/AbstractMockUserSession.java b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/AbstractMockUserSession.java index 22e9e3ab9c5..00968fe8362 100644 --- a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/AbstractMockUserSession.java +++ b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/AbstractMockUserSession.java @@ -31,6 +31,7 @@ import org.sonar.api.web.UserRole; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.server.user.AbstractUserSession; import static com.google.common.base.Preconditions.checkArgument; @@ -78,6 +79,20 @@ public abstract class AbstractMockUserSession<T extends AbstractMockUserSession> return clazz.cast(this); } + public T registerProjects(ProjectDto... projects) { + Arrays.stream(projects) + .forEach(project -> { + if (!project.isPrivate()) { + this.projectUuidByPermission.put(UserRole.USER, project.getUuid()); + this.projectUuidByPermission.put(UserRole.CODEVIEWER, project.getUuid()); + this.projectPermissions.add(UserRole.USER); + this.projectPermissions.add(UserRole.CODEVIEWER); + } + this.projectUuidByComponentUuid.put(project.getUuid(), project.getUuid()); + }); + return clazz.cast(this); + } + public T addProjectPermission(String permission, ComponentDto... components) { Arrays.stream(components).forEach(component -> { checkArgument( @@ -91,6 +106,19 @@ public abstract class AbstractMockUserSession<T extends AbstractMockUserSession> return clazz.cast(this); } + public T addProjectPermission(String permission, ProjectDto... projects) { + Arrays.stream(projects).forEach(component -> { + checkArgument( + component.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission), + "public component %s can't be granted public permission %s", component.getUuid(), permission); + }); + registerProjects(projects); + this.projectPermissions.add(permission); + Arrays.stream(projects) + .forEach(component -> this.projectUuidByPermission.put(permission, component.getUuid())); + return clazz.cast(this); + } + @Override protected Optional<String> componentUuidToProjectUuid(String componentUuid) { return Optional.ofNullable(projectUuidByComponentUuid.get(componentUuid)); diff --git a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java index c72088db1ae..e243f3870d4 100644 --- a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java +++ b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java @@ -31,6 +31,7 @@ import org.junit.runners.model.Statement; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.db.user.GroupDto; import org.sonar.db.user.UserDto; import org.sonar.server.user.UserSession; @@ -192,6 +193,11 @@ public class UserSessionRule implements TestRule, UserSession { return this; } + public UserSessionRule addProjectPermission(String projectPermission, ProjectDto projectDto) { + ensureAbstractMockUserSession().addProjectPermission(projectPermission, projectDto); + return this; + } + public UserSessionRule addPermission(OrganizationPermission permission, String organizationUuid) { ensureAbstractMockUserSession().addPermission(permission, organizationUuid); return this; @@ -240,6 +246,10 @@ public class UserSessionRule implements TestRule, UserSession { return currentUserSession.hasComponentPermission(permission, component); } + @Override public boolean hasProjectPermission(String permission, ProjectDto project) { + return currentUserSession.hasProjectPermission(permission, project); + } + @Override public boolean hasComponentUuidPermission(String permission, String componentUuid) { return currentUserSession.hasComponentUuidPermission(permission, componentUuid); @@ -250,6 +260,10 @@ public class UserSessionRule implements TestRule, UserSession { return currentUserSession.keepAuthorizedComponents(permission, components); } + @Override public List<ProjectDto> keepAuthorizedProjects(String permission, Collection<ProjectDto> projects) { + return currentUserSession.keepAuthorizedProjects(permission, projects); + } + @Override @CheckForNull public String getLogin() { @@ -338,6 +352,11 @@ public class UserSessionRule implements TestRule, UserSession { return this; } + @Override public UserSession checkProjectPermission(String projectPermission, ProjectDto project) { + currentUserSession.checkProjectPermission(projectPermission, project); + return this; + } + @Override public UserSession checkComponentUuidPermission(String permission, String componentUuid) { currentUserSession.checkComponentUuidPermission(permission, componentUuid); diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/platform/BackendCleanup.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/platform/BackendCleanup.java index 36d0f93d7df..ed33fed8a07 100644 --- a/server/sonar-webserver-core/src/main/java/org/sonar/server/platform/BackendCleanup.java +++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/platform/BackendCleanup.java @@ -51,7 +51,7 @@ public class BackendCleanup { private static final String[] ANALYSIS_TABLES = { "ce_activity", "ce_queue", "ce_task_input", "ce_scanner_context", "duplications_index", "events", "issues", "issue_changes", "manual_measures", - "notifications", "project_links", "project_measures", "projects", + "notifications", "project_links", "project_measures", "components", "projects", "snapshots", "file_sources", "webhook_deliveries" }; private static final String[] RESOURCE_RELATED_TABLES = { diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/webhook/WebhookQGChangeEventListener.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/webhook/WebhookQGChangeEventListener.java index b55dfc23b3f..28aa44f588b 100644 --- a/server/sonar-webserver-core/src/main/java/org/sonar/server/webhook/WebhookQGChangeEventListener.java +++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/webhook/WebhookQGChangeEventListener.java @@ -24,14 +24,13 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.apache.commons.lang.StringUtils; import org.sonar.api.measures.Metric; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.AnalysisPropertyDto; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; import org.sonar.db.component.SnapshotDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.qualitygate.EvaluatedQualityGate; import org.sonar.server.qualitygate.changeevent.QGChangeEvent; import org.sonar.server.qualitygate.changeevent.QGChangeEventListener; @@ -79,20 +78,19 @@ public class WebhookQGChangeEventListener implements QGChangeEventListener { private void callWebhook(DbSession dbSession, QGChangeEvent event, @Nullable EvaluatedQualityGate evaluatedQualityGate) { webhooks.sendProjectAnalysisUpdate( - new WebHooks.Analysis(event.getBranch().getUuid(), event.getAnalysis().getUuid(), null), + new WebHooks.Analysis(event.getProject().getUuid(), event.getAnalysis().getUuid(), null), () -> buildWebHookPayload(dbSession, event, evaluatedQualityGate)); } private WebhookPayload buildWebHookPayload(DbSession dbSession, QGChangeEvent event, @Nullable EvaluatedQualityGate evaluatedQualityGate) { - ComponentDto project = event.getProject(); + ProjectDto project = event.getProject(); BranchDto branch = event.getBranch(); SnapshotDto analysis = event.getAnalysis(); Map<String, String> analysisProperties = dbClient.analysisPropertiesDao().selectByAnalysisUuid(dbSession, analysis.getUuid()) .stream() .collect(Collectors.toMap(AnalysisPropertyDto::getKey, AnalysisPropertyDto::getValue)); - String projectUuid = StringUtils.defaultString(project.getMainBranchProjectUuid(), project.projectUuid()); ProjectAnalysis projectAnalysis = new ProjectAnalysis( - new Project(projectUuid, project.getKey(), project.name()), + new Project(project.getUuid(), project.getKey(), project.getName()), null, new Analysis(analysis.getUuid(), analysis.getCreatedAt(), analysis.getRevision()), new Branch(branch.isMain(), branch.getKey(), Type.valueOf(branch.getBranchType().name())), diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/platform/BackendCleanupTest.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/platform/BackendCleanupTest.java index 80d53bf83c1..3d94f332502 100644 --- a/server/sonar-webserver-core/src/test/java/org/sonar/server/platform/BackendCleanupTest.java +++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/platform/BackendCleanupTest.java @@ -70,6 +70,7 @@ public class BackendCleanupTest { underTest.clearDb(); assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(0); + assertThat(dbTester.countRowsOfTable("components")).isEqualTo(0); assertThat(dbTester.countRowsOfTable("snapshots")).isEqualTo(0); assertThat(dbTester.countRowsOfTable("rules")).isEqualTo(0); assertThat(dbTester.countRowsOfTable("properties")).isEqualTo(0); @@ -102,6 +103,7 @@ public class BackendCleanupTest { assertThat(es.countDocuments(ComponentIndexDefinition.TYPE_COMPONENT)).isEqualTo(0); assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(0); + assertThat(dbTester.countRowsOfTable("components")).isEqualTo(0); assertThat(dbTester.countRowsOfTable("snapshots")).isEqualTo(0); assertThat(dbTester.countRowsOfTable("rules")).isEqualTo(0); assertThat(dbTester.countRowsOfTable("properties")).isEqualTo(0); @@ -123,6 +125,7 @@ public class BackendCleanupTest { underTest.resetData(); assertThat(dbTester.countRowsOfTable("projects")).isZero(); + assertThat(dbTester.countRowsOfTable("components")).isZero(); assertThat(dbTester.countRowsOfTable("snapshots")).isZero(); assertThat(dbTester.countRowsOfTable("properties")).isZero(); assertThat(es.countDocuments(IssueIndexDefinition.TYPE_ISSUE)).isZero(); diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java index fe394fe1747..d753969dd6f 100644 --- a/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java +++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/telemetry/TelemetryDataLoaderImplTest.java @@ -103,14 +103,14 @@ public class TelemetryDataLoaderImplTest { MetricDto coverage = db.measures().insertMetric(m -> m.setKey(COVERAGE_KEY)); MetricDto nclocDistrib = db.measures().insertMetric(m -> m.setKey(NCLOC_LANGUAGE_DISTRIBUTION_KEY)); - ComponentDto project1 = db.components().insertMainBranch(db.getDefaultOrganization()); + ComponentDto project1 = db.components().insertPublicProject(db.getDefaultOrganization()); ComponentDto project1Branch = db.components().insertProjectBranch(project1); db.measures().insertLiveMeasure(project1, lines, m -> m.setValue(200d)); db.measures().insertLiveMeasure(project1, ncloc, m -> m.setValue(100d)); db.measures().insertLiveMeasure(project1, coverage, m -> m.setValue(80d)); db.measures().insertLiveMeasure(project1, nclocDistrib, m -> m.setValue(null).setData("java=200;js=50")); - ComponentDto project2 = db.components().insertMainBranch(db.getDefaultOrganization()); + ComponentDto project2 = db.components().insertPublicProject(db.getDefaultOrganization()); db.measures().insertLiveMeasure(project2, lines, m -> m.setValue(300d)); db.measures().insertLiveMeasure(project2, ncloc, m -> m.setValue(200d)); db.measures().insertLiveMeasure(project2, coverage, m -> m.setValue(80d)); @@ -148,7 +148,7 @@ public class TelemetryDataLoaderImplTest { public void take_largest_branches() { server.setId("AU-TpxcB-iU5OvuD2FL7").setVersion("7.5.4"); MetricDto ncloc = db.measures().insertMetric(m -> m.setKey(NCLOC_KEY)); - ComponentDto project = db.components().insertMainBranch(db.getDefaultOrganization()); + ComponentDto project = db.components().insertPublicProject(db.getDefaultOrganization()); ComponentDto branch1 = db.components().insertProjectBranch(project, b -> b.setBranchType(BRANCH)); ComponentDto pr = db.components().insertProjectBranch(project, b -> b.setBranchType(PULL_REQUEST)); db.measures().insertLiveMeasure(project, ncloc, m -> m.setValue(10d)); diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/webhook/WebhookQGChangeEventListenerTest.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/webhook/WebhookQGChangeEventListenerTest.java index 6f956a12407..12cfc351d89 100644 --- a/server/sonar-webserver-core/src/test/java/org/sonar/server/webhook/WebhookQGChangeEventListenerTest.java +++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/webhook/WebhookQGChangeEventListenerTest.java @@ -22,7 +22,6 @@ package org.sonar.server.webhook; import com.tngtech.java.junit.dataprovider.DataProvider; import com.tngtech.java.junit.dataprovider.DataProviderRunner; import com.tngtech.java.junit.dataprovider.UseDataProvider; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,9 +44,9 @@ import org.sonar.db.DbTester; import org.sonar.db.component.AnalysisPropertyDto; 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.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.qualitygate.EvaluatedQualityGate; import org.sonar.server.qualitygate.changeevent.QGChangeEvent; import org.sonar.server.qualitygate.changeevent.QGChangeEventListener; @@ -66,8 +65,6 @@ import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import static org.sonar.core.util.stream.MoreCollectors.toArrayList; import static org.sonar.db.component.BranchType.BRANCH; -import static org.sonar.db.component.ComponentTesting.newBranchDto; -import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto; @RunWith(DataProviderRunner.class) public class WebhookQGChangeEventListenerTest { @@ -145,24 +142,23 @@ public class WebhookQGChangeEventListenerTest { @UseDataProvider("newQGorNot") public void onIssueChanges_calls_webhook_for_changeEvent_with_webhook_enabled(@Nullable EvaluatedQualityGate newQualityGate) { OrganizationDto organization = dbTester.organizations().insert(); - ComponentDto project = dbTester.components().insertPublicProject(organization); - ComponentAndBranch branch = insertProjectBranch(project, BRANCH, "foo"); - SnapshotDto analysis = insertAnalysisTask(branch); + ProjectAndBranch projectBranch = insertBranch(organization, BRANCH, "foo"); + SnapshotDto analysis = insertAnalysisTask(projectBranch); Configuration configuration = mock(Configuration.class); mockPayloadSupplierConsumedByWebhooks(); Map<String, String> properties = new HashMap<>(); properties.put("sonar.analysis.test1", randomAlphanumeric(50)); properties.put("sonar.analysis.test2", randomAlphanumeric(5000)); insertPropertiesFor(analysis.getUuid(), properties); - QGChangeEvent qualityGateEvent = newQGChangeEvent(branch, analysis, configuration, newQualityGate); + QGChangeEvent qualityGateEvent = newQGChangeEvent(projectBranch, analysis, configuration, newQualityGate); mockWebhookEnabled(qualityGateEvent.getProject()); underTest.onIssueChanges(qualityGateEvent, CHANGED_ISSUES_ARE_IGNORED); - ProjectAnalysis projectAnalysis = verifyWebhookCalledAndExtractPayloadFactoryArgument(branch, analysis, qualityGateEvent.getProject()); + ProjectAnalysis projectAnalysis = verifyWebhookCalledAndExtractPayloadFactoryArgument(projectBranch, analysis, qualityGateEvent.getProject()); assertThat(projectAnalysis).isEqualTo( new ProjectAnalysis( - new Project(project.uuid(), project.getKey(), project.name()), + new Project(projectBranch.project.getUuid(), projectBranch.project.getKey(), projectBranch.project.getName()), null, new Analysis(analysis.getUuid(), analysis.getCreatedAt(), analysis.getRevision()), new Branch(false, "foo", Branch.Type.BRANCH), @@ -175,7 +171,7 @@ public class WebhookQGChangeEventListenerTest { @UseDataProvider("newQGorNot") public void onIssueChanges_calls_webhook_on_main_branch(@Nullable EvaluatedQualityGate newQualityGate) { OrganizationDto organization = dbTester.organizations().insert(); - ComponentAndBranch mainBranch = insertMainBranch(organization); + ProjectAndBranch mainBranch = insertMainBranch(organization); SnapshotDto analysis = insertAnalysisTask(mainBranch); Configuration configuration = mock(Configuration.class); QGChangeEvent qualityGateEvent = newQGChangeEvent(mainBranch, analysis, configuration, newQualityGate); @@ -198,8 +194,7 @@ public class WebhookQGChangeEventListenerTest { public void onIssueChangesCallsWebhookOnBranch(BranchType branchType) { OrganizationDto organization = dbTester.organizations().insert(); - ComponentAndBranch mainBranch = insertMainBranch(organization); - ComponentAndBranch nonMainBranch = insertProjectBranch(mainBranch.component, branchType, "foo"); + ProjectAndBranch nonMainBranch = insertBranch(organization, branchType, "foo"); SnapshotDto analysis = insertAnalysisTask(nonMainBranch); Configuration configuration = mock(Configuration.class); QGChangeEvent qualityGateEvent = newQGChangeEvent(nonMainBranch, analysis, configuration, null); @@ -219,14 +214,14 @@ public class WebhookQGChangeEventListenerTest { }; } - private void mockWebhookEnabled(ComponentDto... projects) { - for (ComponentDto dto : projects) { + private void mockWebhookEnabled(ProjectDto... projects) { + for (ProjectDto dto : projects) { when(webHooks.isEnabled(dto)).thenReturn(true); } } - private void mockWebhookDisabled(ComponentDto... projects) { - for (ComponentDto dto : projects) { + private void mockWebhookDisabled(ProjectDto... projects) { + for (ProjectDto dto : projects) { when(webHooks.isEnabled(dto)).thenReturn(false); } } @@ -252,20 +247,20 @@ public class WebhookQGChangeEventListenerTest { dbTester.getSession().commit(); } - private SnapshotDto insertAnalysisTask(ComponentAndBranch componentAndBranch) { - return dbTester.components().insertSnapshot(componentAndBranch.component); + private SnapshotDto insertAnalysisTask(ProjectAndBranch projectAndBranch) { + return dbTester.components().insertSnapshot(projectAndBranch.getBranch()); } - private ProjectAnalysis verifyWebhookCalledAndExtractPayloadFactoryArgument(ComponentAndBranch componentAndBranch, SnapshotDto analysis, ComponentDto project) { - verifyWebhookCalled(componentAndBranch, analysis, project); + private ProjectAnalysis verifyWebhookCalledAndExtractPayloadFactoryArgument(ProjectAndBranch projectAndBranch, SnapshotDto analysis, ProjectDto project) { + verifyWebhookCalled(projectAndBranch, analysis, project); return extractPayloadFactoryArguments(1).iterator().next(); } - private void verifyWebhookCalled(ComponentAndBranch componentAndBranch, SnapshotDto analysis, ComponentDto project) { + private void verifyWebhookCalled(ProjectAndBranch projectAndBranch, SnapshotDto analysis, ProjectDto project) { verify(webHooks).isEnabled(project); verify(webHooks).sendProjectAnalysisUpdate( - eq(new WebHooks.Analysis(componentAndBranch.uuid(), analysis.getUuid(), null)), + eq(new WebHooks.Analysis(projectAndBranch.uuid(), analysis.getUuid(), null)), any()); } @@ -275,33 +270,35 @@ public class WebhookQGChangeEventListenerTest { return projectAnalysisCaptor.getAllValues(); } - public ComponentAndBranch insertMainBranch(OrganizationDto organization) { - ComponentDto project = newPrivateProjectDto(organization); - BranchDto branch = newBranchDto(project, BRANCH).setKey("master"); - dbTester.components().insertComponent(project); - dbClient.branchDao().insert(dbTester.getSession(), branch); + public ProjectAndBranch insertMainBranch(OrganizationDto organization) { + ProjectDto project = dbTester.components().insertPrivateProjectDto(organization); + BranchDto branch = dbTester.getDbClient().branchDao().selectByUuid(dbTester.getSession(), project.getUuid()).get(); dbTester.commit(); - return new ComponentAndBranch(project, branch); + return new ProjectAndBranch(project, branch); } - public ComponentAndBranch insertProjectBranch(ComponentDto project, BranchType type, String branchKey) { - BranchDto branchDto = newBranchDto(project.projectUuid(), type).setKey(branchKey); - ComponentDto newComponent = dbTester.components().insertProjectBranch(project, branchDto); - return new ComponentAndBranch(newComponent, branchDto); + public ProjectAndBranch insertBranch(OrganizationDto organization, BranchType type, String branchKey) { + ProjectDto project = dbTester.components().insertPrivateProjectDto(organization); + BranchDto branch = dbTester.components().insertProjectBranch(project, b -> b.setKey(branchKey).setBranchType(type)); + return new ProjectAndBranch(project, branch); } - private static class ComponentAndBranch { - private final ComponentDto component; + public ProjectAndBranch insertBranch(ProjectDto project, BranchType type, String branchKey) { + BranchDto branch = dbTester.components().insertProjectBranch(project, b -> b.setKey(branchKey).setBranchType(type)); + return new ProjectAndBranch(project, branch); + } + private static class ProjectAndBranch { + private final ProjectDto project; private final BranchDto branch; - private ComponentAndBranch(ComponentDto component, BranchDto branch) { - this.component = component; + private ProjectAndBranch(ProjectDto project, BranchDto branch) { + this.project = project; this.branch = branch; } - public ComponentDto getComponent() { - return component; + public ProjectDto getProject() { + return project; } public BranchDto getBranch() { @@ -309,16 +306,16 @@ public class WebhookQGChangeEventListenerTest { } public String uuid() { - return component.uuid(); + return project.getUuid(); } } private static QGChangeEvent newQGChangeEvent(Configuration configuration, @Nullable Metric.Level previousQQStatus, @Nullable EvaluatedQualityGate evaluatedQualityGate) { - return new QGChangeEvent(new ComponentDto(), new BranchDto(), new SnapshotDto(), configuration, previousQQStatus, () -> Optional.ofNullable(evaluatedQualityGate)); + return new QGChangeEvent(new ProjectDto(), new BranchDto(), new SnapshotDto(), configuration, previousQQStatus, () -> Optional.ofNullable(evaluatedQualityGate)); } - private static QGChangeEvent newQGChangeEvent(ComponentAndBranch branch, SnapshotDto analysis, Configuration configuration, @Nullable EvaluatedQualityGate evaluatedQualityGate) { + private static QGChangeEvent newQGChangeEvent(ProjectAndBranch branch, SnapshotDto analysis, Configuration configuration, @Nullable EvaluatedQualityGate evaluatedQualityGate) { Metric.Level previousStatus = randomLevel(); if (evaluatedQualityGate != null) { Metric.Level otherLevel = stream(Metric.Level.values()) @@ -326,7 +323,7 @@ public class WebhookQGChangeEventListenerTest { .toArray(Metric.Level[]::new)[new Random().nextInt(Metric.Level.values().length - 1)]; when(evaluatedQualityGate.getStatus()).thenReturn(otherLevel); } - return new QGChangeEvent(branch.component, branch.branch, analysis, configuration, previousStatus, () -> Optional.ofNullable(evaluatedQualityGate)); + return new QGChangeEvent(branch.project, branch.branch, analysis, configuration, previousStatus, () -> Optional.ofNullable(evaluatedQualityGate)); } private static Metric.Level randomLevel() { diff --git a/server/sonar-webserver-es/src/main/java/org/sonar/server/permission/index/PermissionIndexerDao.java b/server/sonar-webserver-es/src/main/java/org/sonar/server/permission/index/PermissionIndexerDao.java index 84fb3799091..90d7c5e3a5b 100644 --- a/server/sonar-webserver-es/src/main/java/org/sonar/server/permission/index/PermissionIndexerDao.java +++ b/server/sonar-webserver-es/src/main/java/org/sonar/server/permission/index/PermissionIndexerDao.java @@ -55,35 +55,35 @@ public class PermissionIndexerDao { // users " SELECT '" + RowKind.USER + "' as kind," + - " projects.uuid AS project, " + - " projects.qualifier AS qualifier, " + + " c.uuid AS project, " + + " c.qualifier AS qualifier, " + " user_roles.user_id AS user_id, " + " NULL AS group_id " + - " FROM projects " + - " INNER JOIN user_roles ON user_roles.resource_id = projects.id AND user_roles.role = 'user' " + + " FROM components c " + + " INNER JOIN user_roles ON user_roles.resource_id = c.id AND user_roles.role = 'user' " + " WHERE " + - " (projects.qualifier = 'TRK' " + - " or projects.qualifier = 'VW' " + - " or projects.qualifier = 'APP') " + - " AND projects.copy_component_uuid is NULL " + + " (c.qualifier = 'TRK' " + + " or c.qualifier = 'VW' " + + " or c.qualifier = 'APP') " + + " AND c.copy_component_uuid is NULL " + " {projectsCondition} " + " UNION " + // groups " SELECT '" + RowKind.GROUP + "' as kind," + - " projects.uuid AS project, " + - " projects.qualifier AS qualifier, " + + " c.uuid AS project, " + + " c.qualifier AS qualifier, " + " NULL AS user_id, " + " groups.id AS group_id " + - " FROM projects " + - " INNER JOIN group_roles ON group_roles.resource_id = projects.id AND group_roles.role = 'user' " + + " FROM components c " + + " INNER JOIN group_roles ON group_roles.resource_id = c.id AND group_roles.role = 'user' " + " INNER JOIN groups ON groups.id = group_roles.group_id " + " WHERE " + - " (projects.qualifier = 'TRK' " + - " or projects.qualifier = 'VW' " + - " or projects.qualifier = 'APP') " + - " AND projects.copy_component_uuid is NULL " + + " (c.qualifier = 'TRK' " + + " or c.qualifier = 'VW' " + + " or c.qualifier = 'APP') " + + " AND c.copy_component_uuid is NULL " + " {projectsCondition} " + " AND group_id IS NOT NULL " + " UNION " + @@ -91,33 +91,33 @@ public class PermissionIndexerDao { // public projects are accessible to any one " SELECT '" + RowKind.ANYONE + "' as kind," + - " projects.uuid AS project, " + - " projects.qualifier AS qualifier, " + + " c.uuid AS project, " + + " c.qualifier AS qualifier, " + " NULL AS user_id, " + " NULL AS group_id " + - " FROM projects " + + " FROM components c " + " WHERE " + - " (projects.qualifier = 'TRK' " + - " or projects.qualifier = 'VW' " + - " or projects.qualifier = 'APP') " + - " AND projects.copy_component_uuid is NULL " + - " AND projects.private = ? " + + " (c.qualifier = 'TRK' " + + " or c.qualifier = 'VW' " + + " or c.qualifier = 'APP') " + + " AND c.copy_component_uuid is NULL " + + " AND c.private = ? " + " {projectsCondition} " + " UNION " + // private project is returned when no authorization " SELECT '" + RowKind.NONE + "' as kind," + - " projects.uuid AS project, " + - " projects.qualifier AS qualifier, " + + " c.uuid AS project, " + + " c.qualifier AS qualifier, " + " NULL AS user_id, " + " NULL AS group_id " + - " FROM projects " + + " FROM components c " + " WHERE " + - " (projects.qualifier = 'TRK' " + - " or projects.qualifier = 'VW' " + - " or projects.qualifier = 'APP') " + - " AND projects.copy_component_uuid is NULL " + - " AND projects.private = ? " + + " (c.qualifier = 'TRK' " + + " or c.qualifier = 'VW' " + + " or c.qualifier = 'APP') " + + " AND c.copy_component_uuid is NULL " + + " AND c.private = ? " + " {projectsCondition} " + " ) project_authorization"; @@ -150,7 +150,7 @@ public class PermissionIndexerDao { if (projectUuids.isEmpty()) { sql = StringUtils.replace(SQL_TEMPLATE, "{projectsCondition}", ""); } else { - sql = StringUtils.replace(SQL_TEMPLATE, "{projectsCondition}", " AND projects.uuid in (" + repeat("?", ", ", projectUuids.size()) + ")"); + sql = StringUtils.replace(SQL_TEMPLATE, "{projectsCondition}", " AND c.uuid in (" + repeat("?", ", ", projectUuids.size()) + ")"); } PreparedStatement stmt = dbClient.getMyBatis().newScrollingSelectStatement(session, sql); int index = 1; diff --git a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFiltersTest.java b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFiltersTest.java index 5e5cdabaa30..1bde99b73d9 100644 --- a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFiltersTest.java +++ b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFiltersTest.java @@ -245,7 +245,7 @@ public class IssueIndexFiltersTest { @Test public void do_not_return_issues_from_project_branch_when_filtering_by_portfolios() { ComponentDto portfolio = db.components().insertPrivateApplication(db.getDefaultOrganization()); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto projectBranch = db.components().insertProjectBranch(project); ComponentDto fileOnProjectBranch = db.components().insertComponent(newFileDto(projectBranch)); indexView(portfolio.uuid(), singletonList(project.uuid())); @@ -359,7 +359,7 @@ public class IssueIndexFiltersTest { @Test public void filter_by_application_branch() { - ComponentDto application = db.components().insertMainBranch(c -> c.setQualifier(APP)); + ComponentDto application = db.components().insertPublicProject(c -> c.setQualifier(APP)); ComponentDto branch1 = db.components().insertProjectBranch(application); ComponentDto branch2 = db.components().insertProjectBranch(application); ComponentDto project1 = db.components().insertPrivateProject(); @@ -385,7 +385,7 @@ public class IssueIndexFiltersTest { @Test public void filter_by_application_branch_having_project_branches() { - ComponentDto application = db.components().insertMainBranch(c -> c.setQualifier(APP).setDbKey("app")); + ComponentDto application = db.components().insertPublicProject(c -> c.setQualifier(APP).setDbKey("app")); ComponentDto applicationBranch1 = db.components().insertProjectBranch(application, a -> a.setKey("app-branch1")); ComponentDto applicationBranch2 = db.components().insertProjectBranch(application, a -> a.setKey("app-branch2")); ComponentDto project1 = db.components().insertPrivateProject(p -> p.setDbKey("prj1")); diff --git a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexProjectStatisticsTest.java b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexProjectStatisticsTest.java index e71d84133b9..2ccf3703050 100644 --- a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexProjectStatisticsTest.java +++ b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexProjectStatisticsTest.java @@ -45,7 +45,7 @@ import static org.mockito.Mockito.mock; import static org.sonar.api.resources.Qualifiers.PROJECT; import static org.sonar.db.component.ComponentTesting.newBranchDto; import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto; -import static org.sonar.db.component.ComponentTesting.newProjectBranch; +import static org.sonar.db.component.ComponentTesting.newBranchComponent; import static org.sonar.db.organization.OrganizationTesting.newOrganizationDto; import static org.sonar.server.issue.IssueDocTesting.newDoc; @@ -246,7 +246,7 @@ public class IssueIndexProjectStatisticsTest { public void searchProjectStatistics_return_branch_issues() { OrganizationDto organization = newOrganizationDto(); ComponentDto project = newPrivateProjectDto(organization); - ComponentDto branch = newProjectBranch(project, newBranchDto(project).setKey("branch")); + ComponentDto branch = newBranchComponent(project, newBranchDto(project).setKey("branch")); String userUuid = randomAlphanumeric(40); long from = 1_111_234_567_890L; indexIssues( diff --git a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java index a2055da067c..fcba3067c1b 100644 --- a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java +++ b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java @@ -289,7 +289,7 @@ public class IssueIndexTest { @Test public void searchBranchStatistics() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch1 = db.components().insertProjectBranch(project); ComponentDto branch2 = db.components().insertProjectBranch(project); ComponentDto branch3 = db.components().insertProjectBranch(project); @@ -310,7 +310,7 @@ public class IssueIndexTest { @Test public void searchBranchStatistics_on_many_branches() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); List<String> branchUuids = new ArrayList<>(); List<Tuple> expectedResult = new ArrayList<>(); IntStream.range(0, 15).forEach(i -> { @@ -330,7 +330,7 @@ public class IssueIndexTest { @Test public void searchBranchStatistics_on_empty_list() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); assertThat(underTest.searchBranchStatistics(project.uuid(), emptyList())).isEmpty(); assertThat(underTest.searchBranchStatistics(project.uuid(), singletonList("unknown"))).isEmpty(); diff --git a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueQueryFactoryTest.java b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueQueryFactoryTest.java index 702e71257f9..28922bbf6dc 100644 --- a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueQueryFactoryTest.java +++ b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueQueryFactoryTest.java @@ -445,7 +445,7 @@ public class IssueQueryFactoryTest { @Test public void search_issues_from_main_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); assertThat(underTest.create(new SearchRequest() @@ -476,7 +476,7 @@ public class IssueQueryFactoryTest { @Test public void search_by_application_key_and_branch() { - ComponentDto application = db.components().insertMainBranch(c -> c.setQualifier(APP).setDbKey("app")); + ComponentDto application = db.components().insertPublicProject(c -> c.setQualifier(APP).setDbKey("app")); ComponentDto applicationBranch1 = db.components().insertProjectBranch(application, a -> a.setKey("app-branch1")); ComponentDto applicationBranch2 = db.components().insertProjectBranch(application, a -> a.setKey("app-branch2")); ComponentDto project1 = db.components().insertPrivateProject(p -> p.setDbKey("prj1")); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/MeasureAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/MeasureAction.java index cb1911d5793..8b9dbbf5f43 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/MeasureAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/MeasureAction.java @@ -34,6 +34,7 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService.NewAction; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.db.component.BranchDto; import org.sonar.db.component.ComponentDto; import org.sonar.db.measure.LiveMeasureDto; import org.sonar.db.metric.MetricDto; @@ -141,10 +142,10 @@ public class MeasureAction implements ProjectBadgesWsAction { response.stream().setMediaType(SVG); String metricKey = request.mandatoryParam(PARAM_METRIC); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = support.getComponent(dbSession, request); + BranchDto branch = support.getBranch(dbSession, request); MetricDto metric = dbClient.metricDao().selectByKey(dbSession, metricKey); checkState(metric != null && metric.isEnabled(), "Metric '%s' hasn't been found", metricKey); - LiveMeasureDto measure = getMeasure(dbSession, project, metricKey); + LiveMeasureDto measure = getMeasure(dbSession, branch, metricKey); String result = generateSvg(metric, measure); String eTag = getETag(result); Optional<String> requestedETag = request.header("If-None-Match"); @@ -162,8 +163,8 @@ public class MeasureAction implements ProjectBadgesWsAction { } } - private LiveMeasureDto getMeasure(DbSession dbSession, ComponentDto project, String metricKey) { - return dbClient.liveMeasureDao().selectMeasure(dbSession, project.uuid(), metricKey) + private LiveMeasureDto getMeasure(DbSession dbSession, BranchDto branch, String metricKey) { + return dbClient.liveMeasureDao().selectMeasure(dbSession, branch.getUuid(), metricKey) .orElseThrow(() -> new ProjectBadgesException("Measure has not been found")); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/ProjectBadgesSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/ProjectBadgesSupport.java index b66599bcb2b..818e10b1ce3 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/ProjectBadgesSupport.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/ProjectBadgesSupport.java @@ -19,19 +19,16 @@ */ package org.sonar.server.badge.ws; -import java.util.Optional; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.WebService; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.user.UserSession; -import static org.sonar.api.resources.Qualifiers.APP; -import static org.sonar.api.resources.Qualifiers.PROJECT; import static org.sonar.api.web.UserRole.USER; import static org.sonar.db.component.BranchType.BRANCH; import static org.sonar.server.ws.KeyExamples.KEY_BRANCH_EXAMPLE_001; @@ -63,33 +60,34 @@ public class ProjectBadgesSupport { .setExampleValue(KEY_BRANCH_EXAMPLE_001); } - ComponentDto getComponent(DbSession dbSession, Request request) { + BranchDto getBranch(DbSession dbSession, Request request) { try { String projectKey = request.mandatoryParam(PARAM_PROJECT); String branchName = request.param(PARAM_BRANCH); - ComponentDto project = componentFinder.getByKeyAndOptionalBranchOrPullRequest(dbSession, projectKey, branchName, null); - checkComponentType(dbSession, project); - userSession.checkComponentPermission(USER, project); - return project; + ProjectDto project = componentFinder.getProjectOrApplicationByKey(dbSession, projectKey); + userSession.checkProjectPermission(USER, project); + if (project.isPrivate()) { + throw generateInvalidProjectException(); + } + + BranchDto branch; + if (branchName == null) { + branch = componentFinder.getMainBranch(dbSession, project); + } else { + branch = componentFinder.getBranchOrPullRequest(dbSession, project, branchName, null); + } + + if (!branch.getBranchType().equals(BRANCH)) { + throw generateInvalidProjectException(); + } + + return branch; } catch (NotFoundException e) { throw new NotFoundException("Project has not been found"); } } - private void checkComponentType(DbSession dbSession, ComponentDto project) { - Optional<BranchDto> branch = dbClient.branchDao().selectByUuid(dbSession, project.uuid()); - if (project.isPrivate()) { - throw generateInvalidProjectExcpetion(); - } - if (branch.isPresent() && !branch.get().getBranchType().equals(BRANCH)) { - throw generateInvalidProjectExcpetion(); - } - if (!project.qualifier().equals(PROJECT) && !project.qualifier().equals(APP)) { - throw generateInvalidProjectExcpetion(); - } - } - - private static ProjectBadgesException generateInvalidProjectExcpetion() { + private static ProjectBadgesException generateInvalidProjectException() { return new ProjectBadgesException("Project is invalid"); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/QualityGateAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/QualityGateAction.java index 6d6eac8803f..33ad574ea4a 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/QualityGateAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/QualityGateAction.java @@ -31,6 +31,7 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService.NewAction; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.db.component.BranchDto; import org.sonar.db.component.ComponentDto; import org.sonar.db.measure.LiveMeasureDto; import org.sonar.server.exceptions.ForbiddenException; @@ -71,8 +72,8 @@ public class QualityGateAction implements ProjectBadgesWsAction { response.setHeader("Cache-Control", "no-cache"); response.stream().setMediaType(SVG); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = support.getComponent(dbSession, request); - Level qualityGateStatus = getQualityGate(dbSession, project); + BranchDto branch = support.getBranch(dbSession, request); + Level qualityGateStatus = getQualityGate(dbSession, branch); String result = svgGenerator.generateQualityGate(qualityGateStatus); String eTag = getETag(result); Optional<String> requestedETag = request.header("If-None-Match"); @@ -90,8 +91,8 @@ public class QualityGateAction implements ProjectBadgesWsAction { } } - private Level getQualityGate(DbSession dbSession, ComponentDto project) { - return Level.valueOf(dbClient.liveMeasureDao().selectMeasure(dbSession, project.uuid(), ALERT_STATUS_KEY) + private Level getQualityGate(DbSession dbSession, BranchDto branch) { + return Level.valueOf(dbClient.liveMeasureDao().selectMeasure(dbSession, branch.getUuid(), ALERT_STATUS_KEY) .map(LiveMeasureDto::getTextValue) .orElseThrow(() -> new ProjectBadgesException("Quality gate has not been found"))); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/batch/ProjectDataLoader.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/batch/ProjectDataLoader.java index db1e69a4a9d..3f1e46e8c3c 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/batch/ProjectDataLoader.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/batch/ProjectDataLoader.java @@ -24,7 +24,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Nullable; -import org.sonar.api.config.Configuration; import org.sonar.api.server.ServerSide; import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; @@ -40,7 +39,6 @@ import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.user.UserSession; -import static org.sonar.process.ProcessProperties.Property.SONARCLOUD_ENABLED; import static org.sonar.server.exceptions.BadRequestException.checkRequest; @ServerSide @@ -49,13 +47,11 @@ public class ProjectDataLoader { private final DbClient dbClient; private final UserSession userSession; private final ComponentFinder componentFinder; - private final boolean isSonarCloud; - public ProjectDataLoader(DbClient dbClient, UserSession userSession, ComponentFinder componentFinder, Configuration configuration) { + public ProjectDataLoader(DbClient dbClient, UserSession userSession, ComponentFinder componentFinder) { this.dbClient = dbClient; this.userSession = userSession; this.componentFinder = componentFinder; - this.isSonarCloud = configuration.getBoolean(SONARCLOUD_ENABLED.getKey()).orElse(false); } public ProjectRepositories load(ProjectDataQuery query) { @@ -118,13 +114,8 @@ public class ProjectDataLoader { private void checkPermission(boolean hasScanPerm) { if (!hasScanPerm) { - if (isSonarCloud) { - throw new ForbiddenException("You're not authorized to push analysis results to SonarCloud. " + - "Please contact your SonarCloud organization administrator."); - } else { - throw new ForbiddenException("You're not authorized to push analysis results to the SonarQube server. " + - "Please contact your SonarQube administrator."); - } + throw new ForbiddenException("You're not authorized to push analysis results to the SonarQube server. " + + "Please contact your SonarQube administrator."); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/pr/ws/DeleteAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/pr/ws/DeleteAction.java index 39296448f2c..d2ee27e8364 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/pr/ws/DeleteAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/pr/ws/DeleteAction.java @@ -27,7 +27,7 @@ import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentCleanerService; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; @@ -73,21 +73,20 @@ public class DeleteAction implements PullRequestWsAction { String pullRequestId = request.mandatoryParam(PARAM_PULL_REQUEST); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = componentFinder.getRootComponentByUuidOrKey(dbSession, null, projectKey); + ProjectDto project = componentFinder.getProjectOrApplicationByKey(dbSession, projectKey); checkPermission(project); - BranchDto pullRequest = dbClient.branchDao().selectByPullRequestKey(dbSession, project.uuid(), pullRequestId) + BranchDto pullRequest = dbClient.branchDao().selectByPullRequestKey(dbSession, project.getUuid(), pullRequestId) .filter(branch -> branch.getBranchType() == PULL_REQUEST) .orElseThrow(() -> new NotFoundException(String.format("Pull request '%s' is not found for project '%s'", pullRequestId, projectKey))); - ComponentDto branchComponent = componentFinder.getByKeyAndPullRequest(dbSession, projectKey, pullRequest.getKey()); - componentCleanerService.deleteBranch(dbSession, branchComponent); + componentCleanerService.deleteBranch(dbSession, pullRequest); response.noContent(); } } - private void checkPermission(ComponentDto project) { - userSession.checkComponentPermission(UserRole.ADMIN, project); + private void checkPermission(ProjectDto project) { + userSession.checkProjectPermission(UserRole.ADMIN, project); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/pr/ws/ListAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/pr/ws/ListAction.java index 37ca162b421..6c3c8b0aa87 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/pr/ws/ListAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/pr/ws/ListAction.java @@ -33,24 +33,22 @@ import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; import org.sonar.db.component.SnapshotDto; import org.sonar.db.measure.LiveMeasureDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.db.protobuf.DbProjectBranches; import org.sonar.server.component.ComponentFinder; -import org.sonar.server.issue.index.PrStatistics; import org.sonar.server.issue.index.IssueIndex; +import org.sonar.server.issue.index.PrStatistics; import org.sonar.server.user.UserSession; import org.sonarqube.ws.ProjectPullRequests; -import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Strings.emptyToNull; import static java.util.Collections.singletonList; import static java.util.Objects.requireNonNull; import static java.util.Optional.ofNullable; import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY; -import static org.sonar.api.resources.Qualifiers.PROJECT; import static org.sonar.api.utils.DateUtils.formatDateTime; import static org.sonar.api.web.UserRole.USER; import static org.sonar.core.util.stream.MoreCollectors.toList; @@ -96,11 +94,11 @@ public class ListAction implements PullRequestWsAction { String projectKey = request.mandatoryParam(PARAM_PROJECT); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = componentFinder.getByKey(dbSession, projectKey); + ProjectDto project = componentFinder.getProjectOrApplicationByKey(dbSession, projectKey); checkPermission(project); - checkArgument(project.isEnabled() && PROJECT.equals(project.qualifier()), "Invalid project key"); + // TODO support disabled projects? - List<BranchDto> pullRequests = dbClient.branchDao().selectByComponent(dbSession, project).stream() + List<BranchDto> pullRequests = dbClient.branchDao().selectByProject(dbSession, project).stream() .filter(b -> b.getBranchType() == PULL_REQUEST) .collect(toList()); List<String> pullRequestUuids = pullRequests.stream().map(BranchDto::getUuid).collect(toList()); @@ -109,7 +107,7 @@ public class ListAction implements PullRequestWsAction { .selectByUuids(dbSession, pullRequests.stream().map(BranchDto::getMergeBranchUuid).filter(Objects::nonNull).collect(toList())) .stream().collect(uniqueIndex(BranchDto::getUuid)); - Map<String, PrStatistics> branchStatisticsByBranchUuid = issueIndex.searchBranchStatistics(project.uuid(), pullRequestUuids).stream() + Map<String, PrStatistics> branchStatisticsByBranchUuid = issueIndex.searchBranchStatistics(project.getUuid(), pullRequestUuids).stream() .collect(uniqueIndex(PrStatistics::getBranchUuid, Function.identity())); Map<String, LiveMeasureDto> qualityGateMeasuresByComponentUuids = dbClient.liveMeasureDao() .selectByComponentUuidsAndMetricKeys(dbSession, pullRequestUuids, singletonList(ALERT_STATUS_KEY)).stream() @@ -125,10 +123,10 @@ public class ListAction implements PullRequestWsAction { } } - private void checkPermission(ComponentDto component) { - if (userSession.hasComponentPermission(USER, component) || - userSession.hasComponentPermission(UserRole.SCAN, component) || - userSession.hasPermission(OrganizationPermission.SCAN, component.getOrganizationUuid())) { + private void checkPermission(ProjectDto project) { + if (userSession.hasProjectPermission(USER, project) || + userSession.hasProjectPermission(UserRole.SCAN, project) || + userSession.hasPermission(OrganizationPermission.SCAN, project.getOrganizationUuid())) { return; } throw insufficientPrivilegesException(); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/DeleteAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/DeleteAction.java index 44d3510cc03..d8aed30b6ea 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/DeleteAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/DeleteAction.java @@ -27,7 +27,7 @@ import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentCleanerService; import org.sonar.server.component.ComponentFinder; import org.sonar.server.project.ProjectLifeCycleListeners; @@ -39,8 +39,8 @@ import static org.sonar.server.branch.ws.BranchesWs.addProjectParam; import static org.sonar.server.branch.ws.ProjectBranchesParameters.ACTION_DELETE; import static org.sonar.server.branch.ws.ProjectBranchesParameters.PARAM_BRANCH; import static org.sonar.server.branch.ws.ProjectBranchesParameters.PARAM_PROJECT; -import static org.sonar.server.project.Project.from; import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; +import static org.sonar.server.project.Project.from; public class DeleteAction implements BranchWsAction { private final DbClient dbClient; @@ -62,8 +62,8 @@ public class DeleteAction implements BranchWsAction { public void define(NewController context) { WebService.NewAction action = context.createAction(ACTION_DELETE) .setSince("6.6") - .setDescription("Delete a non-main branch of a project.<br/>" + - "Requires 'Administer' rights on the specified project.") + .setDescription("Delete a non-main branch of a project or application.<br/>" + + "Requires 'Administer' rights on the specified project or application.") .setPost(true) .setHandler(this); @@ -78,25 +78,24 @@ public class DeleteAction implements BranchWsAction { String branchKey = request.mandatoryParam(PARAM_BRANCH); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = componentFinder.getRootComponentByUuidOrKey(dbSession, null, projectKey); + ProjectDto project = componentFinder.getProjectOrApplicationByKey(dbSession, projectKey); checkPermission(project); BranchDto branch = checkFoundWithOptional( - dbClient.branchDao().selectByBranchKey(dbSession, project.uuid(), branchKey), + dbClient.branchDao().selectByBranchKey(dbSession, project.getUuid(), branchKey), "Branch '%s' not found for project '%s'", branchKey, projectKey); if (branch.isMain()) { throw new IllegalArgumentException("Only non-main branches can be deleted"); } - ComponentDto branchComponent = componentFinder.getByKeyAndBranch(dbSession, projectKey, branchKey); - componentCleanerService.deleteBranch(dbSession, branchComponent); + componentCleanerService.deleteBranch(dbSession, branch); projectLifeCycleListeners.onProjectBranchesDeleted(singleton(from(project))); response.noContent(); } } - private void checkPermission(ComponentDto project) { - userSession.checkComponentPermission(UserRole.ADMIN, project); + private void checkPermission(ProjectDto project) { + userSession.checkProjectPermission(UserRole.ADMIN, project); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/ListAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/ListAction.java index cd3a2359668..9c5c255eb2a 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/ListAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/ListAction.java @@ -19,14 +19,10 @@ */ package org.sonar.server.branch.ws; -import com.google.common.collect.ImmutableSet; import com.google.common.io.Resources; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; import javax.annotation.Nullable; import org.sonar.api.server.ws.Change; import org.sonar.api.server.ws.Request; @@ -36,21 +32,18 @@ import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; import org.sonar.db.component.SnapshotDto; import org.sonar.db.measure.LiveMeasureDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; import org.sonar.server.ws.WsUtils; import org.sonarqube.ws.Common; import org.sonarqube.ws.ProjectBranches; -import static com.google.common.base.Preconditions.checkArgument; import static java.util.Collections.singletonList; import static java.util.Optional.ofNullable; import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY; -import static org.sonar.api.resources.Qualifiers.APP; -import static org.sonar.api.resources.Qualifiers.PROJECT; import static org.sonar.api.utils.DateUtils.formatDateTime; import static org.sonar.api.web.UserRole.USER; import static org.sonar.core.util.stream.MoreCollectors.toList; @@ -63,9 +56,6 @@ import static org.sonar.server.branch.ws.ProjectBranchesParameters.PARAM_PROJECT import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException; public class ListAction implements BranchWsAction { - - private static final Set<String> ALLOWED_QUALIFIERS = ImmutableSet.of(PROJECT, APP); - private final DbClient dbClient; private final UserSession userSession; private final ComponentFinder componentFinder; @@ -80,8 +70,8 @@ public class ListAction implements BranchWsAction { public void define(WebService.NewController context) { WebService.NewAction action = context.createAction(ACTION_LIST) .setSince("6.6") - .setDescription("List the branches of a project.<br/>" + - "Requires 'Browse' or 'Execute analysis' rights on the specified project.") + .setDescription("List the branches of a project or application.<br/>" + + "Requires 'Browse' or 'Execute analysis' rights on the specified project or application.") .setResponseExample(Resources.getResource(getClass(), "list-example.json")) .setChangelog(new Change("7.2", "Application can be used on this web service")) .setHandler(this); @@ -94,19 +84,14 @@ public class ListAction implements BranchWsAction { String projectKey = request.mandatoryParam(PARAM_PROJECT); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = componentFinder.getByKey(dbSession, projectKey); - checkPermission(project); - checkArgument(ALLOWED_QUALIFIERS.contains(project.qualifier()), "Invalid project"); + ProjectDto projectOrApp = componentFinder.getProjectOrApplicationByKey(dbSession, projectKey); + checkPermission(projectOrApp); - Collection<BranchDto> branches = dbClient.branchDao().selectByComponent(dbSession, project).stream() + Collection<BranchDto> branches = dbClient.branchDao().selectByProject(dbSession, projectOrApp).stream() .filter(b -> b.getBranchType() == BRANCH) .collect(toList()); List<String> branchUuids = branches.stream().map(BranchDto::getUuid).collect(toList()); - // TODO is this still used? - Map<String, BranchDto> mergeBranchesByUuid = dbClient.branchDao() - .selectByUuids(dbSession, branches.stream().map(BranchDto::getMergeBranchUuid).filter(Objects::nonNull).collect(toList())) - .stream().collect(uniqueIndex(BranchDto::getUuid)); Map<String, LiveMeasureDto> qualityGateMeasuresByComponentUuids = dbClient.liveMeasureDao() .selectByComponentUuidsAndMetricKeys(dbSession, branchUuids, singletonList(ALERT_STATUS_KEY)).stream() .collect(uniqueIndex(LiveMeasureDto::getComponentUuid)); @@ -115,15 +100,15 @@ public class ListAction implements BranchWsAction { .collect(uniqueIndex(SnapshotDto::getComponentUuid, s -> formatDateTime(s.getCreatedAt()))); ProjectBranches.ListWsResponse.Builder protobufResponse = ProjectBranches.ListWsResponse.newBuilder(); - branches.forEach(b -> addBranch(protobufResponse, b, mergeBranchesByUuid, qualityGateMeasuresByComponentUuids.get(b.getUuid()), + branches.forEach(b -> addBranch(protobufResponse, b, qualityGateMeasuresByComponentUuids.get(b.getUuid()), analysisDateByBranchUuid.get(b.getUuid()))); WsUtils.writeProtobuf(protobufResponse.build(), request, response); } } - private static void addBranch(ProjectBranches.ListWsResponse.Builder response, BranchDto branch, Map<String, BranchDto> mergeBranchesByUuid, + private static void addBranch(ProjectBranches.ListWsResponse.Builder response, BranchDto branch, @Nullable LiveMeasureDto qualityGateMeasure, @Nullable String analysisDate) { - ProjectBranches.Branch.Builder builder = toBranchBuilder(branch, Optional.ofNullable(mergeBranchesByUuid.get(branch.getMergeBranchUuid()))); + ProjectBranches.Branch.Builder builder = toBranchBuilder(branch); setBranchStatus(builder, qualityGateMeasure); if (analysisDate != null) { builder.setAnalysisDate(analysisDate); @@ -131,7 +116,7 @@ public class ListAction implements BranchWsAction { response.addBranches(builder); } - private static ProjectBranches.Branch.Builder toBranchBuilder(BranchDto branch, Optional<BranchDto> mergeBranch) { + private static ProjectBranches.Branch.Builder toBranchBuilder(BranchDto branch) { ProjectBranches.Branch.Builder builder = ProjectBranches.Branch.newBuilder(); String branchKey = branch.getKey(); ofNullable(branchKey).ifPresent(builder::setName); @@ -150,10 +135,10 @@ public class ListAction implements BranchWsAction { builder.setStatus(statusBuilder); } - private void checkPermission(ComponentDto component) { - if (!userSession.hasComponentPermission(USER, component) && - !userSession.hasComponentPermission(UserRole.SCAN, component) && - !userSession.hasPermission(SCAN, component.getOrganizationUuid())) { + private void checkPermission(ProjectDto project) { + if (!userSession.hasProjectPermission(USER, project) && + !userSession.hasProjectPermission(UserRole.SCAN, project) && + !userSession.hasPermission(SCAN, project.getOrganizationUuid())) { throw insufficientPrivilegesException(); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/RenameAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/RenameAction.java index 8604543b997..542ddb2588d 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/RenameAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/RenameAction.java @@ -28,7 +28,7 @@ import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; @@ -53,8 +53,8 @@ public class RenameAction implements BranchWsAction { public void define(NewController context) { WebService.NewAction action = context.createAction(ACTION_RENAME) .setSince("6.6") - .setDescription("Rename the main branch of a project.<br/>" - + "Requires 'Administer' permission on the specified project.") + .setDescription("Rename the main branch of a project or application.<br/>" + + "Requires 'Administer' permission on the specified project or application.") .setPost(true) .setHandler(this); @@ -74,21 +74,21 @@ public class RenameAction implements BranchWsAction { String newBranchName = request.mandatoryParam(PARAM_NAME); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = componentFinder.getRootComponentByUuidOrKey(dbSession, null, projectKey); + ProjectDto project = componentFinder.getProjectOrApplicationByKey(dbSession, projectKey); checkPermission(project); - Optional<BranchDto> existingBranch = dbClient.branchDao().selectByBranchKey(dbSession, project.uuid(), newBranchName); + Optional<BranchDto> existingBranch = dbClient.branchDao().selectByBranchKey(dbSession, project.getUuid(), newBranchName); checkArgument(!existingBranch.filter(b -> !b.isMain()).isPresent(), "Impossible to update branch name: a branch with name \"%s\" already exists in the project.", newBranchName); - dbClient.branchDao().updateMainBranchName(dbSession, project.uuid(), newBranchName); + dbClient.branchDao().updateMainBranchName(dbSession, project.getUuid(), newBranchName); dbSession.commit(); response.noContent(); } } - private void checkPermission(ComponentDto project) { - userSession.checkComponentPermission(UserRole.ADMIN, project); + private void checkPermission(ProjectDto project) { + userSession.checkProjectPermission(UserRole.ADMIN, project); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionAction.java index dc656c411ca..232ab398b31 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionAction.java @@ -26,7 +26,7 @@ import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.user.UserSession; @@ -57,7 +57,7 @@ public class SetAutomaticDeletionProtectionAction implements BranchWsAction { WebService.NewAction action = context.createAction(ACTION_SET_AUTOMATIC_DELETION_PROTECTION) .setSince("8.1") .setDescription("Protect a specific branch from automatic deletion. Protection can't be disabled for the main branch.<br/>" - + "Requires 'Administer' permission on the specified project.") + + "Requires 'Administer' permission on the specified project or application.") .setPost(true) .setHandler(this); @@ -78,10 +78,10 @@ public class SetAutomaticDeletionProtectionAction implements BranchWsAction { boolean excludeFromPurge = request.mandatoryParamAsBoolean(PARAM_VALUE); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = componentFinder.getRootComponentByUuidOrKey(dbSession, null, projectKey); + ProjectDto project = componentFinder.getProjectOrApplicationByKey(dbSession, projectKey); checkPermission(project); - BranchDto branch = dbClient.branchDao().selectByBranchKey(dbSession, project.uuid(), branchKey) + BranchDto branch = dbClient.branchDao().selectByBranchKey(dbSession, project.getUuid(), branchKey) .orElseThrow(() -> new NotFoundException(format("Branch '%s' not found for project '%s'", branchKey, projectKey))); checkArgument(!branch.isMain() || excludeFromPurge, "Main branch of the project is always excluded from automatic deletion."); @@ -92,7 +92,7 @@ public class SetAutomaticDeletionProtectionAction implements BranchWsAction { } - private void checkPermission(ComponentDto project) { - userSession.checkComponentPermission(UserRole.ADMIN, project); + private void checkPermission(ProjectDto project) { + userSession.checkProjectPermission(UserRole.ADMIN, project); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/queue/ReportSubmitter.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/queue/ReportSubmitter.java index c48b3722173..6f3fb1bad78 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/queue/ReportSubmitter.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/queue/ReportSubmitter.java @@ -178,7 +178,8 @@ public class ReportSubmitter { .setQualifier(Qualifiers.PROJECT) .setPrivate(newProjectPrivate) .build(); - return componentUpdater.createWithoutCommit(dbSession, newProject, userId); + return componentUpdater.createWithoutCommit(dbSession, newProject, userId, c -> { + }); } private CeTask submitReport(DbSession dbSession, InputStream reportInput, ComponentDto project, Map<String, String> characteristics) { diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/AnalysisStatusAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/AnalysisStatusAction.java index 517731c8085..9980cb3a9f7 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/AnalysisStatusAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/AnalysisStatusAction.java @@ -22,8 +22,6 @@ package org.sonar.server.ce.ws; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.sonar.api.resources.Qualifiers; -import org.sonar.api.resources.Scopes; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; @@ -33,7 +31,8 @@ import org.sonar.db.DbSession; import org.sonar.db.ce.CeActivityDto; import org.sonar.db.ce.CeTaskMessageDto; import org.sonar.db.ce.CeTaskTypes; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.component.BranchDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; import org.sonar.server.ws.KeyExamples; @@ -42,9 +41,9 @@ import org.sonarqube.ws.Ce.AnalysisStatusWsResponse; import static org.sonar.server.ce.ws.CeWsParameters.PARAM_BRANCH; import static org.sonar.server.ce.ws.CeWsParameters.PARAM_COMPONENT; import static org.sonar.server.ce.ws.CeWsParameters.PARAM_PULL_REQUEST; +import static org.sonar.server.exceptions.BadRequestException.checkRequest; import static org.sonar.server.ws.KeyExamples.KEY_BRANCH_EXAMPLE_001; import static org.sonar.server.ws.KeyExamples.KEY_PULL_REQUEST_EXAMPLE_001; -import static org.sonar.server.exceptions.BadRequestException.checkRequest; import static org.sonar.server.ws.WsUtils.writeProtobuf; public class AnalysisStatusAction implements CeWsAction { @@ -84,53 +83,38 @@ public class AnalysisStatusAction implements CeWsAction { @Override public void handle(Request request, Response response) throws Exception { - String componentKey = request.mandatoryParam(PARAM_COMPONENT); + String projectKey = request.mandatoryParam(PARAM_COMPONENT); String branchKey = request.param(PARAM_BRANCH); String pullRequestKey = request.param(PARAM_PULL_REQUEST); checkRequest(branchKey == null || pullRequestKey == null, "Parameters '%s' and '%s' must not be specified at the same time", PARAM_BRANCH, PARAM_PULL_REQUEST); - doHandle(request, response, componentKey, branchKey, pullRequestKey); + doHandle(request, response, projectKey, branchKey, pullRequestKey); } - private void doHandle(Request request, Response response, String componentKey, @Nullable String branchKey, @Nullable String pullRequestKey) { + private void doHandle(Request request, Response response, String projectKey, @Nullable String branchKey, @Nullable String pullRequestKey) { try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto component = loadComponent(dbSession, componentKey, branchKey, pullRequestKey); - userSession.checkComponentPermission(UserRole.USER, component); - - checkRequest(isProject(component), "Component '%s' must be a project.", componentKey); + ProjectDto project = componentFinder.getProjectByKey(dbSession, projectKey); + userSession.checkProjectPermission(UserRole.USER, project); + BranchDto branch = componentFinder.getBranchOrPullRequest(dbSession, project, branchKey, pullRequestKey); AnalysisStatusWsResponse.Builder responseBuilder = AnalysisStatusWsResponse.newBuilder(); CeActivityDto lastActivity = dbClient.ceActivityDao() - .selectLastByComponentUuidAndTaskType(dbSession, component.uuid(), CeTaskTypes.REPORT).orElse(null); - responseBuilder.setComponent(formatComponent(dbSession, component, lastActivity, branchKey, pullRequestKey)); + .selectLastByComponentUuidAndTaskType(dbSession, branch.getUuid(), CeTaskTypes.REPORT).orElse(null); + responseBuilder.setComponent(formatComponent(dbSession, project, lastActivity, branchKey, pullRequestKey)); writeProtobuf(responseBuilder.build(), request, response); } } - private static boolean isProject(ComponentDto project) { - return Scopes.PROJECT.equals(project.scope()) && Qualifiers.PROJECT.equals(project.qualifier()); - } - - private ComponentDto loadComponent(DbSession dbSession, String componentKey, @Nullable String branchKey, @Nullable String pullRequestKey) { - if (branchKey != null) { - return componentFinder.getByKeyAndBranch(dbSession, componentKey, branchKey); - } - if (pullRequestKey != null) { - return componentFinder.getByKeyAndPullRequest(dbSession, componentKey, pullRequestKey); - } - return componentFinder.getByKey(dbSession, componentKey); - } - - private AnalysisStatusWsResponse.Component formatComponent(DbSession dbSession, ComponentDto component, @Nullable CeActivityDto lastActivity, + private AnalysisStatusWsResponse.Component formatComponent(DbSession dbSession, ProjectDto project, @Nullable CeActivityDto lastActivity, @Nullable String branchKey, @Nullable String pullRequestKey) { AnalysisStatusWsResponse.Component.Builder builder = AnalysisStatusWsResponse.Component.newBuilder() - .setOrganization(getOrganizationKey(dbSession, component)) - .setKey(component.getKey()) - .setName(component.name()); + .setOrganization(getOrganizationKey(dbSession, project)) + .setKey(project.getKey()) + .setName(project.getName()); if (branchKey != null) { builder.setBranch(branchKey); @@ -149,8 +133,8 @@ public class AnalysisStatusAction implements CeWsAction { return builder.build(); } - private String getOrganizationKey(DbSession dbSession, ComponentDto component) { - String organizationUuid = component.getOrganizationUuid(); + private String getOrganizationKey(DbSession dbSession, ProjectDto project) { + String organizationUuid = project.getOrganizationUuid(); return dbClient.organizationDao().selectByUuid(dbSession, organizationUuid) .orElseThrow(() -> new IllegalStateException("Unknown organization: " + organizationUuid)) .getKey(); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentCleanerService.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentCleanerService.java index 799c68d0473..b3ebbd866aa 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentCleanerService.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentCleanerService.java @@ -26,7 +26,9 @@ import org.sonar.api.resources.Scopes; import org.sonar.api.server.ServerSide; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.db.component.BranchDto; import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.es.ProjectIndexers; import static com.google.common.base.Preconditions.checkArgument; @@ -37,40 +39,53 @@ import static org.sonar.server.es.ProjectIndexer.Cause.PROJECT_DELETION; public class ComponentCleanerService { private final DbClient dbClient; - private final ResourceTypes resourceTypes; private final ProjectIndexers projectIndexers; - public ComponentCleanerService(DbClient dbClient, ResourceTypes resourceTypes, ProjectIndexers projectIndexers) { + public ComponentCleanerService(DbClient dbClient, ProjectIndexers projectIndexers) { this.dbClient = dbClient; - this.resourceTypes = resourceTypes; this.projectIndexers = projectIndexers; } - public void delete(DbSession dbSession, List<ComponentDto> projects) { - for (ComponentDto project : projects) { + public void delete(DbSession dbSession, List<ProjectDto> projects) { + for (ProjectDto project : projects) { delete(dbSession, project); } } - public void deleteBranch(DbSession dbSession, ComponentDto branch) { + public void deleteComponents(DbSession dbSession, List<ComponentDto> components) { + for (ComponentDto component : components) { + delete(dbSession, component); + } + } + + public void deleteBranch(DbSession dbSession, BranchDto branch) { // TODO: detect if other branches depend on it? - dbClient.purgeDao().deleteBranch(dbSession, branch.uuid()); - projectIndexers.commitAndIndex(dbSession, singletonList(branch), PROJECT_DELETION); + dbClient.purgeDao().deleteBranch(dbSession, branch.getUuid()); + projectIndexers.commitAndIndexBranches(dbSession, singletonList(branch), PROJECT_DELETION); + } + + public void delete(DbSession dbSession, ProjectDto project) { + dbClient.purgeDao().deleteProject(dbSession, project.getUuid()); + dbClient.userDao().cleanHomepage(dbSession, project); + projectIndexers.commitAndIndexProjects(dbSession, singletonList(project), PROJECT_DELETION); } public void delete(DbSession dbSession, ComponentDto project) { - checkArgument(!hasNotProjectScope(project) && !isNotDeletable(project) && project.getMainBranchProjectUuid() == null, "Only projects can be deleted"); + checkArgument(!hasNotProjectScope(project) && project.getMainBranchProjectUuid() == null, "Only projects can be deleted"); dbClient.purgeDao().deleteProject(dbSession, project.uuid()); dbClient.userDao().cleanHomepage(dbSession, project); - projectIndexers.commitAndIndex(dbSession, singletonList(project), PROJECT_DELETION); + projectIndexers.commitAndIndexComponents(dbSession, singletonList(project), PROJECT_DELETION); } private static boolean hasNotProjectScope(ComponentDto project) { return !Scopes.PROJECT.equals(project.scope()); } - private boolean isNotDeletable(ComponentDto project) { - ResourceType resourceType = resourceTypes.get(project.qualifier()); - return resourceType == null || !resourceType.getBooleanProperty("deletable"); - } + // TODO check if we need to filter as before + + //private boolean isNotDeletable(ComponentDto project) { + // ResourceType resourceType = resourceTypes.get(project.qualifier()); + // return resourceType == null || !resourceType.getBooleanProperty("deletable"); + //} + } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentFinder.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentFinder.java index 980ae5e326b..b1662fd425b 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentFinder.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentFinder.java @@ -30,14 +30,16 @@ import org.sonar.api.resources.Scopes; import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.db.component.BranchDto; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.exceptions.NotFoundException; import static com.google.common.base.Preconditions.checkArgument; import static java.lang.String.format; -import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; import static org.sonar.server.exceptions.BadRequestException.checkRequest; +import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; public class ComponentFinder { private static final String MSG_COMPONENT_ID_OR_KEY_TEMPLATE = "Either '%s' or '%s' must be provided"; @@ -63,11 +65,59 @@ public class ComponentFinder { return getByKey(dbSession, checkParamNotEmpty(componentKey, parameterNames.getKeyParam())); } + public ProjectDto getProjectByKey(DbSession dbSession, String projectKey) { + return dbClient.projectDao().selectProjectByKey(dbSession, projectKey) + .orElseThrow(() -> new NotFoundException(String.format("Project '%s' not found", projectKey))); + } + + public ProjectDto getApplicationByKey(DbSession dbSession, String applicationKey) { + return dbClient.projectDao().selectApplicationByKey(dbSession, applicationKey) + .orElseThrow(() -> new NotFoundException(String.format("Application '%s' not found", applicationKey))); + } + + public ProjectDto getProjectOrApplicationByKey(DbSession dbSession, String projectKey) { + return dbClient.projectDao().selectProjectOrAppByKey(dbSession, projectKey) + .orElseThrow(() -> new NotFoundException(String.format("Project '%s' not found", projectKey))); + } + + public ProjectDto getProjectByUuid(DbSession dbSession, String projectUuid) { + return dbClient.projectDao().selectByUuid(dbSession, projectUuid) + .filter(p -> Qualifiers.PROJECT.equals(p.getQualifier())) + .orElseThrow(() -> new NotFoundException(String.format("Project '%s' not found", projectUuid))); + } + + public ProjectDto getProjectByUuidOrKey(DbSession dbSession, @Nullable String projectUuid, @Nullable String projectKey, ParamNames parameterNames) { + checkByUuidOrKey(projectUuid, projectKey, parameterNames); + + if (projectUuid != null) { + return getProjectByUuid(dbSession, checkParamNotEmpty(projectUuid, parameterNames.getUuidParam())); + } + + return getProjectByKey(dbSession, checkParamNotEmpty(projectKey, parameterNames.getKeyParam())); + } + private static String checkParamNotEmpty(String value, String param) { checkArgument(!value.isEmpty(), MSG_PARAMETER_MUST_NOT_BE_EMPTY, param); return value; } + public BranchDto getBranchOrPullRequest(DbSession dbSession, ProjectDto project, @Nullable String branchKey, @Nullable String pullRequestKey) { + if (branchKey != null) { + return dbClient.branchDao().selectByBranchKey(dbSession, project.getUuid(), branchKey) + .orElseThrow(() -> new NotFoundException(String.format("Branch '%s' in project '%s' not found", branchKey, project.getKey()))); + } else if (pullRequestKey != null) { + return dbClient.branchDao().selectByPullRequestKey(dbSession, project.getUuid(), pullRequestKey) + .orElseThrow(() -> new NotFoundException(String.format("Pull request '%s' in project '%s' not found", pullRequestKey, project.getKey()))); + } + return dbClient.branchDao().selectByUuid(dbSession, project.getUuid()) + .orElseThrow(() -> new NotFoundException(String.format("Main branch in project '%s' not found", project.getKey()))); + } + + public BranchDto getMainBranch(DbSession dbSession, ProjectDto projectDto) { + return dbClient.branchDao().selectByUuid(dbSession, projectDto.getUuid()) + .orElseThrow(() -> new IllegalStateException(String.format("Can't find main branch for project '%s'", projectDto.getKey()))); + } + private static void checkByUuidOrKey(@Nullable String componentUuid, @Nullable String componentKey, ParamNames parameterNames) { checkArgument(componentUuid != null ^ componentKey != null, MSG_COMPONENT_ID_OR_KEY_TEMPLATE, parameterNames.getUuidParam(), parameterNames.getKeyParam()); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentService.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentService.java index 89d5e015415..064d94f81a2 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentService.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentService.java @@ -30,6 +30,7 @@ import org.sonar.db.DbSession; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentKeyUpdaterDao; import org.sonar.db.component.ResourceDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.es.ProjectIndexer; import org.sonar.server.es.ProjectIndexers; import org.sonar.server.project.Project; @@ -41,7 +42,6 @@ import static java.util.Collections.emptyList; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; import static org.sonar.core.component.ComponentKeys.isValidProjectKey; -import static org.sonar.db.component.ComponentKeyUpdaterDao.checkIsProjectOrModule; import static org.sonar.server.exceptions.BadRequestException.checkRequest; @ServerSide @@ -58,27 +58,20 @@ public class ComponentService { this.projectLifeCycleListeners = projectLifeCycleListeners; } - public void updateKey(DbSession dbSession, ComponentDto projectOrModule, String newKey) { - userSession.checkComponentPermission(UserRole.ADMIN, projectOrModule); - checkIsProjectOrModule(projectOrModule); - checkProjectOrModuleKeyFormat(newKey); - dbClient.componentKeyUpdaterDao().updateKey(dbSession, projectOrModule.uuid(), newKey); - projectIndexers.commitAndIndex(dbSession, singletonList(projectOrModule), ProjectIndexer.Cause.PROJECT_KEY_UPDATE); - if (isMainProject(projectOrModule)) { - Project newProject = new Project(projectOrModule.uuid(), newKey, projectOrModule.name(), projectOrModule.description(), projectOrModule.getTags()); - projectLifeCycleListeners.onProjectsRekeyed(singleton(new RekeyedProject(newProject, projectOrModule.getDbKey()))); - } - } - - private static boolean isMainProject(ComponentDto projectOrModule) { - return projectOrModule.isRootProject() && projectOrModule.getMainBranchProjectUuid() == null; + public void updateKey(DbSession dbSession, ProjectDto project, String newKey) { + userSession.checkProjectPermission(UserRole.ADMIN, project); + checkProjectKeyFormat(newKey); + dbClient.componentKeyUpdaterDao().updateKey(dbSession, project.getUuid(), newKey); + projectIndexers.commitAndIndexProjects(dbSession, singletonList(project), ProjectIndexer.Cause.PROJECT_KEY_UPDATE); + Project newProject = new Project(project.getUuid(), newKey, project.getName(), project.getDescription(), project.getTags()); + projectLifeCycleListeners.onProjectsRekeyed(singleton(new RekeyedProject(newProject, project.getKey()))); } - public void bulkUpdateKey(DbSession dbSession, ComponentDto projectOrModule, String stringToReplace, String replacementString) { + public void bulkUpdateKey(DbSession dbSession, ProjectDto project, String stringToReplace, String replacementString) { Set<ComponentKeyUpdaterDao.RekeyedResource> rekeyedProjects = dbClient.componentKeyUpdaterDao().bulkUpdateKey( - dbSession, projectOrModule.uuid(), stringToReplace, replacementString, + dbSession, project.getUuid(), stringToReplace, replacementString, ComponentService::isMainProject); - projectIndexers.commitAndIndex(dbSession, singletonList(projectOrModule), ProjectIndexer.Cause.PROJECT_KEY_UPDATE); + projectIndexers.commitAndIndexProjects(dbSession, singletonList(project), ProjectIndexer.Cause.PROJECT_KEY_UPDATE); if (!rekeyedProjects.isEmpty()) { projectLifeCycleListeners.onProjectsRekeyed(rekeyedProjects.stream() .map(ComponentService::toRekeyedProject) @@ -101,7 +94,7 @@ public class ComponentService { return new RekeyedProject(project, rekeyedResource.getOldKey()); } - private static void checkProjectOrModuleKeyFormat(String key) { + private static void checkProjectKeyFormat(String key) { checkRequest(isValidProjectKey(key), "Malformed key for '%s'. It cannot be empty nor contain whitespaces.", key); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentUpdater.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentUpdater.java index b927a646eaf..86f3c21a379 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentUpdater.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentUpdater.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet; import java.util.Date; import java.util.Locale; import java.util.Set; +import java.util.function.Consumer; import javax.annotation.Nullable; import org.sonar.api.resources.Qualifiers; import org.sonar.api.resources.Scopes; @@ -34,12 +35,14 @@ import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.es.ProjectIndexer.Cause; import org.sonar.server.es.ProjectIndexers; import org.sonar.server.favorite.FavoriteUpdater; import org.sonar.server.permission.PermissionTemplateService; import static java.util.Collections.singletonList; +import static org.sonar.api.resources.Qualifiers.APP; import static org.sonar.api.resources.Qualifiers.PROJECT; import static org.sonar.core.component.ComponentKeys.isValidProjectKey; import static org.sonar.server.exceptions.BadRequestException.checkRequest; @@ -56,8 +59,8 @@ public class ComponentUpdater { private final ProjectIndexers projectIndexers; public ComponentUpdater(DbClient dbClient, I18n i18n, System2 system2, - PermissionTemplateService permissionTemplateService, FavoriteUpdater favoriteUpdater, - ProjectIndexers projectIndexers) { + PermissionTemplateService permissionTemplateService, FavoriteUpdater favoriteUpdater, + ProjectIndexers projectIndexers) { this.dbClient = dbClient; this.i18n = i18n; this.system2 = system2; @@ -73,7 +76,8 @@ public class ComponentUpdater { * - Index component in es indexes */ public ComponentDto create(DbSession dbSession, NewComponent newComponent, @Nullable Integer userId) { - ComponentDto componentDto = createWithoutCommit(dbSession, newComponent, userId); + ComponentDto componentDto = createWithoutCommit(dbSession, newComponent, userId, c -> { + }); commitAndIndex(dbSession, componentDto); return componentDto; } @@ -82,9 +86,9 @@ public class ComponentUpdater { * Create component without committing. * Don't forget to call commitAndIndex(...) when ready to commit. */ - public ComponentDto createWithoutCommit(DbSession dbSession, NewComponent newComponent, @Nullable Integer userId) { + public ComponentDto createWithoutCommit(DbSession dbSession, NewComponent newComponent, @Nullable Integer userId, Consumer<ComponentDto> componentModifier) { checkKeyFormat(newComponent.qualifier(), newComponent.key()); - ComponentDto componentDto = createRootComponent(dbSession, newComponent); + ComponentDto componentDto = createRootComponent(dbSession, newComponent, componentModifier); if (isRootProject(componentDto)) { createMainBranch(dbSession, componentDto.uuid()); } @@ -96,10 +100,11 @@ public class ComponentUpdater { projectIndexers.commitAndIndex(dbSession, singletonList(componentDto), Cause.PROJECT_CREATION); } - private ComponentDto createRootComponent(DbSession session, NewComponent newComponent) { + private ComponentDto createRootComponent(DbSession session, NewComponent newComponent, Consumer<ComponentDto> componentModifier) { checkRequest(!dbClient.componentDao().selectByKey(session, newComponent.key()).isPresent(), "Could not create %s, key already exists: %s", getQualifierToDisplay(newComponent.qualifier()), newComponent.key()); + long now = system2.now(); String uuid = Uuids.create(); ComponentDto component = new ComponentDto() .setOrganizationUuid(newComponent.getOrganizationUuid()) @@ -115,12 +120,31 @@ public class ComponentUpdater { .setScope(Scopes.PROJECT) .setQualifier(newComponent.qualifier()) .setPrivate(newComponent.isPrivate()) - .setCreatedAt(new Date(system2.now())); + .setCreatedAt(new Date(now)); + + componentModifier.accept(component); dbClient.componentDao().insert(session, component); + if (isRootProject(component)) { + ProjectDto projectDto = toProjectDto(component, now); + dbClient.projectDao().insert(session, projectDto); + } return component; } + private static ProjectDto toProjectDto(ComponentDto component, long now) { + return new ProjectDto() + .setUuid(component.uuid()) + .setKey(component.getKey()) + .setQualifier(component.qualifier()) + .setName(component.name()) + .setPrivate(component.isPrivate()) + .setOrganizationUuid(component.getOrganizationUuid()) + .setDescription(component.description()) + .setUpdatedAt(now) + .setCreatedAt(now); + } + private static boolean isRootProject(ComponentDto componentDto) { return Scopes.PROJECT.equals(componentDto.scope()) && MAIN_BRANCH_QUALIFIERS.contains(componentDto.qualifier()); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveMeasureComputerImpl.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveMeasureComputerImpl.java index de398120132..928264bf090 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveMeasureComputerImpl.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveMeasureComputerImpl.java @@ -41,6 +41,7 @@ import org.sonar.db.measure.LiveMeasureComparator; import org.sonar.db.measure.LiveMeasureDto; import org.sonar.db.metric.MetricDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.es.ProjectIndexer; import org.sonar.server.es.ProjectIndexers; import org.sonar.server.measure.DebtRatingGrid; @@ -93,11 +94,11 @@ public class LiveMeasureComputerImpl implements LiveMeasureComputer { private Optional<QGChangeEvent> refreshComponentsOnSameProject(DbSession dbSession, List<ComponentDto> touchedComponents) { // load all the components to be refreshed, including their ancestors List<ComponentDto> components = loadTreeOfComponents(dbSession, touchedComponents); - ComponentDto project = findProject(components); - OrganizationDto organization = loadOrganization(dbSession, project); - BranchDto branch = loadBranch(dbSession, project); - - Optional<SnapshotDto> lastAnalysis = dbClient.snapshotDao().selectLastAnalysisByRootComponentUuid(dbSession, project.uuid()); + ComponentDto branchComponent = findBranchComponent(components); + OrganizationDto organization = loadOrganization(dbSession, branchComponent); + BranchDto branch = loadBranch(dbSession, branchComponent); + ProjectDto project = loadProject(dbSession, branch.getProjectUuid()); + Optional<SnapshotDto> lastAnalysis = dbClient.snapshotDao().selectLastAnalysisByRootComponentUuid(dbSession, branchComponent.uuid()); if (!lastAnalysis.isPresent()) { return Optional.empty(); } @@ -113,7 +114,7 @@ public class LiveMeasureComputerImpl implements LiveMeasureComputer { // previous status must be load now as MeasureMatrix mutate the LiveMeasureDto which are passed to it Metric.Level previousStatus = loadPreviousStatus(metrics, dbMeasures); - Configuration config = projectConfigurationLoader.loadProjectConfiguration(dbSession, project); + Configuration config = projectConfigurationLoader.loadProjectConfiguration(dbSession, branchComponent); DebtRatingGrid debtRatingGrid = new DebtRatingGrid(config); MeasureMatrix matrix = new MeasureMatrix(components, metricsPerId.values(), dbMeasures); @@ -135,12 +136,12 @@ public class LiveMeasureComputerImpl implements LiveMeasureComputer { } }); - EvaluatedQualityGate evaluatedQualityGate = qGateComputer.refreshGateStatus(project, qualityGate, matrix); + EvaluatedQualityGate evaluatedQualityGate = qGateComputer.refreshGateStatus(branchComponent, qualityGate, matrix); // persist the measures that have been created or updated matrix.getChanged().sorted(LiveMeasureComparator.INSTANCE) .forEach(m -> dbClient.liveMeasureDao().insertOrUpdate(dbSession, m)); - projectIndexer.commitAndIndex(dbSession, singleton(project), ProjectIndexer.Cause.MEASURE_CHANGE); + projectIndexer.commitAndIndex(dbSession, singleton(branchComponent), ProjectIndexer.Cause.MEASURE_CHANGE); return Optional.of( new QGChangeEvent(project, branch, lastAnalysis.get(), config, previousStatus, () -> Optional.of(evaluatedQualityGate))); @@ -210,14 +211,19 @@ public class LiveMeasureComputerImpl implements LiveMeasureComputer { return metricKeys; } - private static ComponentDto findProject(Collection<ComponentDto> components) { + private static ComponentDto findBranchComponent(Collection<ComponentDto> components) { return components.stream().filter(ComponentDto::isRootProject).findFirst() .orElseThrow(() -> new IllegalStateException("No project found in " + components)); } - private BranchDto loadBranch(DbSession dbSession, ComponentDto project) { - return dbClient.branchDao().selectByUuid(dbSession, project.uuid()) - .orElseThrow(() -> new IllegalStateException("Branch not found: " + project.uuid())); + private BranchDto loadBranch(DbSession dbSession, ComponentDto branchComponent) { + return dbClient.branchDao().selectByUuid(dbSession, branchComponent.uuid()) + .orElseThrow(() -> new IllegalStateException("Branch not found: " + branchComponent.uuid())); + } + + private ProjectDto loadProject(DbSession dbSession, String uuid) { + return dbClient.projectDao().selectByUuid(dbSession, uuid) + .orElseThrow(() -> new IllegalStateException("Project not found: " + uuid)); } private OrganizationDto loadOrganization(DbSession dbSession, ComponentDto project) { diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveQualityGateComputer.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveQualityGateComputer.java index 573b63b42b0..0e133da2a95 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveQualityGateComputer.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveQualityGateComputer.java @@ -25,13 +25,14 @@ import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.qualitygate.EvaluatedQualityGate; import org.sonar.server.qualitygate.QualityGate; @ServerSide public interface LiveQualityGateComputer { - QualityGate loadQualityGate(DbSession dbSession, OrganizationDto organization, ComponentDto project, BranchDto branch); + QualityGate loadQualityGate(DbSession dbSession, OrganizationDto organization, ProjectDto project, BranchDto branch); EvaluatedQualityGate refreshGateStatus(ComponentDto project, QualityGate gate, MeasureMatrix measureMatrix); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveQualityGateComputerImpl.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveQualityGateComputerImpl.java index cf828288ffc..e0d4ff3220c 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveQualityGateComputerImpl.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/LiveQualityGateComputerImpl.java @@ -36,6 +36,7 @@ import org.sonar.db.component.ComponentDto; import org.sonar.db.measure.LiveMeasureDto; import org.sonar.db.metric.MetricDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.server.qualitygate.Condition; @@ -62,10 +63,9 @@ public class LiveQualityGateComputerImpl implements LiveQualityGateComputer { } @Override - public QualityGate loadQualityGate(DbSession dbSession, OrganizationDto organization, ComponentDto project, BranchDto branch) { - ComponentDto mainProject = project.getMainBranchProjectUuid() == null ? project : dbClient.componentDao().selectOrFailByKey(dbSession, project.getKey()); - QualityGateDto gateDto = qGateFinder.getQualityGate(dbSession, organization, mainProject) - .orElseThrow(() -> new IllegalStateException(format("Quality Gate not found for project %s", mainProject.getKey()))) + public QualityGate loadQualityGate(DbSession dbSession, OrganizationDto organization, ProjectDto project, BranchDto branch) { + QualityGateDto gateDto = qGateFinder.getQualityGate(dbSession, organization, project) + .orElseThrow(() -> new IllegalStateException(format("Quality Gate not found for project %s", project.getKey()))) .getQualityGate(); Collection<QualityGateConditionDto> conditionDtos = dbClient.gateConditionDao().selectForQualityGate(dbSession, gateDto.getId()); Set<Integer> metricIds = conditionDtos.stream().map(c -> (int) c.getMetricId()) diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ListAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ListAction.java index 98e751de99f..161afe2d542 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ListAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ListAction.java @@ -33,18 +33,18 @@ import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.component.BranchType; import org.sonar.db.component.SnapshotDto; import org.sonar.db.newcodeperiod.NewCodePeriodDao; import org.sonar.db.newcodeperiod.NewCodePeriodDto; import org.sonar.db.newcodeperiod.NewCodePeriodType; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; import org.sonarqube.ws.NewCodePeriods; import org.sonarqube.ws.NewCodePeriods.ListWSResponse; import static org.sonar.core.util.stream.MoreCollectors.toList; -import static org.sonar.db.component.BranchType.BRANCH; import static org.sonar.server.ws.WsUtils.writeProtobuf; import static org.sonarqube.ws.NewCodePeriods.ShowWSResponse.newBuilder; @@ -82,13 +82,13 @@ public class ListAction implements NewCodePeriodsWsAction { String projectKey = request.mandatoryParam(PARAM_PROJECT); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = componentFinder.getByKey(dbSession, projectKey); - userSession.checkComponentPermission(UserRole.ADMIN, project); - Collection<BranchDto> branches = dbClient.branchDao().selectByComponent(dbSession, project).stream() - .filter(b -> b.getBranchType() == BRANCH) + ProjectDto project = componentFinder.getProjectByKey(dbSession, projectKey); + userSession.checkProjectPermission(UserRole.ADMIN, project); + Collection<BranchDto> branches = dbClient.branchDao().selectByProject(dbSession, project).stream() + .filter(b -> b.getBranchType() == BranchType.BRANCH) .collect(toList()); - List<NewCodePeriodDto> newCodePeriods = newCodePeriodDao.selectAllByProject(dbSession, project.uuid()); + List<NewCodePeriodDto> newCodePeriods = newCodePeriodDao.selectAllByProject(dbSession, project.getUuid()); Map<String, InheritedNewCodePeriod> newCodePeriodByBranchUuid = newCodePeriods .stream() @@ -112,7 +112,7 @@ public class ListAction implements NewCodePeriodsWsAction { //handles specific analysis only Long analysisDate = analysisUuidDateMap.get(analysis.get(inherited.getUuid())); - if (analysisDate != null ) { + if (analysisDate != null) { effectiveValue = DateUtils.formatDateTime(analysisDate); } @@ -131,7 +131,7 @@ public class ListAction implements NewCodePeriodsWsAction { } private static NewCodePeriods.ShowWSResponse build(String projectKey, String branchKey, NewCodePeriodType newCodePeriodType, - @Nullable String value, boolean inherited, @Nullable String effectiveValue) { + @Nullable String value, boolean inherited, @Nullable String effectiveValue) { NewCodePeriods.ShowWSResponse.Builder builder = newBuilder() .setType(convertType(newCodePeriodType)) .setInherited(inherited) diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/SetAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/SetAction.java index f7febfd11c5..b79f029d3a0 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/SetAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/SetAction.java @@ -33,13 +33,12 @@ import org.sonar.core.platform.PlatformEditionProvider; import org.sonar.db.DbClient; import org.sonar.db.DbSession; 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.NewCodePeriodDao; import org.sonar.db.newcodeperiod.NewCodePeriodDto; import org.sonar.db.newcodeperiod.NewCodePeriodParser; import org.sonar.db.newcodeperiod.NewCodePeriodType; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.user.UserSession; @@ -49,7 +48,6 @@ import static java.lang.String.format; import static org.sonar.db.newcodeperiod.NewCodePeriodType.NUMBER_OF_DAYS; import static org.sonar.db.newcodeperiod.NewCodePeriodType.PREVIOUS_VERSION; import static org.sonar.db.newcodeperiod.NewCodePeriodType.SPECIFIC_ANALYSIS; -import static org.sonar.server.component.ComponentFinder.ParamNames.PROJECT_ID_AND_KEY; public class SetAction implements NewCodePeriodsWsAction { private static final String PARAM_BRANCH = "branch"; @@ -123,10 +121,10 @@ public class SetAction implements NewCodePeriodsWsAction { @Override public void handle(Request request, Response response) throws Exception { - String projectStr = request.getParam(PARAM_PROJECT).emptyAsNull().or(() -> null); - String branchStr = request.getParam(PARAM_BRANCH).emptyAsNull().or(() -> null); + String projectKey = request.getParam(PARAM_PROJECT).emptyAsNull().or(() -> null); + String branchKey = request.getParam(PARAM_BRANCH).emptyAsNull().or(() -> null); - if (projectStr == null && branchStr != null) { + if (projectKey == null && branchKey != null) { throw new IllegalArgumentException("If branch key is specified, project key needs to be specified too"); } @@ -135,34 +133,41 @@ public class SetAction implements NewCodePeriodsWsAction { String valueStr = request.getParam(PARAM_VALUE).emptyAsNull().or(() -> null); boolean isCommunityEdition = editionProvider.get().filter(t -> t == EditionProvider.Edition.COMMUNITY).isPresent(); - NewCodePeriodType type = validateType(typeStr, projectStr == null, branchStr != null || isCommunityEdition); + NewCodePeriodType type = validateType(typeStr, projectKey == null, branchKey != null || isCommunityEdition); NewCodePeriodDto dto = new NewCodePeriodDto(); dto.setType(type); - ComponentDto projectBranch = null; - if (projectStr != null) { - projectBranch = getProject(dbSession, projectStr, branchStr); - userSession.checkComponentPermission(UserRole.ADMIN, projectBranch); - // in CE set main branch value instead of project value - if (branchStr != null || isCommunityEdition) { - dto.setBranchUuid(projectBranch.uuid()); + ProjectDto project = null; + BranchDto branch = null; + + if (projectKey != null) { + project = getProject(dbSession, projectKey); + userSession.checkProjectPermission(UserRole.ADMIN, project); + + if (branchKey != null) { + branch = getBranch(dbSession, project, branchKey); + dto.setBranchUuid(branch.getUuid()); + } else if (isCommunityEdition) { + // in CE set main branch value instead of project value + branch = getMainBranch(dbSession, project); + dto.setBranchUuid(branch.getUuid()); } - // depending whether it's the main branch or not - dto.setProjectUuid(projectBranch.getMainBranchProjectUuid() != null ? projectBranch.getMainBranchProjectUuid() : projectBranch.uuid()); + + dto.setProjectUuid(project.getUuid()); } else { userSession.checkIsSystemAdministrator(); } - setValue(dbSession, dto, type, projectBranch, branchStr, valueStr); + setValue(dbSession, dto, type, project, branch, valueStr); newCodePeriodDao.upsert(dbSession, dto); dbSession.commit(); } } - private void setValue(DbSession dbSession, NewCodePeriodDto dto, NewCodePeriodType type, @Nullable ComponentDto projectBranch, - @Nullable String branch, @Nullable String value) { + private void setValue(DbSession dbSession, NewCodePeriodDto dto, NewCodePeriodType type, @Nullable ProjectDto project, + @Nullable BranchDto branch, @Nullable String value) { switch (type) { case PREVIOUS_VERSION: Preconditions.checkArgument(value == null, "Unexpected value for type '%s'", type); @@ -173,8 +178,8 @@ public class SetAction implements NewCodePeriodsWsAction { break; case SPECIFIC_ANALYSIS: requireValue(type, value); - requireBranch(type, projectBranch); - SnapshotDto analysis = getAnalysis(dbSession, value, projectBranch, branch); + requireBranch(type, branch); + SnapshotDto analysis = getAnalysis(dbSession, value, project, branch); dto.setValue(analysis.getUuid()); break; default: @@ -194,23 +199,24 @@ public class SetAction implements NewCodePeriodsWsAction { Preconditions.checkArgument(value != null, "New Code Period type '%s' requires a value", type); } - private static void requireBranch(NewCodePeriodType type, @Nullable ComponentDto projectBranch) { - Preconditions.checkArgument(projectBranch != null, "New Code Period type '%s' requires a branch", type); + private static void requireBranch(NewCodePeriodType type, @Nullable BranchDto branch) { + Preconditions.checkArgument(branch != null, "New Code Period type '%s' requires a branch", type); } - private ComponentDto getProject(DbSession dbSession, String projectKey, @Nullable String branchKey) { - if (branchKey == null) { - return componentFinder.getByUuidOrKey(dbSession, null, projectKey, PROJECT_ID_AND_KEY); - } - ComponentDto project = componentFinder.getByKeyAndBranch(dbSession, projectKey, branchKey); - - BranchDto branchDto = dbClient.branchDao().selectByUuid(dbSession, project.uuid()) - .orElseThrow(() -> new NotFoundException(format("Branch '%s' is not found", branchKey))); + private BranchDto getBranch(DbSession dbSession, ProjectDto project, String branchKey) { + return dbClient.branchDao().selectByBranchKey(dbSession, project.getUuid(), branchKey) + .orElseThrow(() -> new NotFoundException(format("Branch '%s' in project '%s' not found", branchKey, project.getKey()))); + } - checkArgument(branchDto.getBranchType() == BranchType.BRANCH, - "Not a branch: '%s'", branchKey); + private ProjectDto getProject(DbSession dbSession, String projectKey) { + return componentFinder.getProjectByKey(dbSession, projectKey); + } - return project; + private BranchDto getMainBranch(DbSession dbSession, ProjectDto project) { + return dbClient.branchDao().selectByProject(dbSession, project) + .stream().filter(BranchDto::isMain) + .findFirst() + .orElseThrow(() -> new NotFoundException(format("Main branch in project '%s' is not found", project.getKey()))); } private static NewCodePeriodType validateType(String typeStr, boolean isOverall, boolean isBranch) { @@ -231,26 +237,20 @@ public class SetAction implements NewCodePeriodsWsAction { return type; } - private SnapshotDto getAnalysis(DbSession dbSession, String analysisUuid, ComponentDto projectBranch, @Nullable String branchKey) { + private SnapshotDto getAnalysis(DbSession dbSession, String analysisUuid, ProjectDto project, BranchDto branch) { SnapshotDto snapshotDto = dbClient.snapshotDao().selectByUuid(dbSession, analysisUuid) .orElseThrow(() -> new NotFoundException(format("Analysis '%s' is not found", analysisUuid))); - checkAnalysis(dbSession, projectBranch, branchKey, snapshotDto); + checkAnalysis(dbSession, project, branch, snapshotDto); return snapshotDto; } - private void checkAnalysis(DbSession dbSession, ComponentDto projectBranch, @Nullable String branchKey, SnapshotDto analysis) { - ComponentDto project = dbClient.componentDao().selectByUuid(dbSession, analysis.getComponentUuid()).orElse(null); + private void checkAnalysis(DbSession dbSession, ProjectDto project, BranchDto branch, SnapshotDto analysis) { + BranchDto analysisBranch = dbClient.branchDao().selectByUuid(dbSession, analysis.getComponentUuid()).orElse(null); + boolean analysisMatchesProjectBranch = analysisBranch != null && analysisBranch.getUuid().equals(branch.getUuid()); - boolean analysisMatchesProjectBranch = project != null && projectBranch.uuid().equals(project.uuid()); - if (branchKey != null) { - checkArgument(analysisMatchesProjectBranch, - "Analysis '%s' does not belong to branch '%s' of project '%s'", - analysis.getUuid(), branchKey, projectBranch.getKey()); - } else { - checkArgument(analysisMatchesProjectBranch, - "Analysis '%s' does not belong to project '%s'", - analysis.getUuid(), projectBranch.getKey()); - } + checkArgument(analysisMatchesProjectBranch, + "Analysis '%s' does not belong to branch '%s' of project '%s'", + analysis.getUuid(), branch.getKey(), project.getKey()); } private static void checkType(String name, Set<NewCodePeriodType> validTypes, NewCodePeriodType type) { diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ShowAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ShowAction.java index 00d1a30ac60..43163e09d5d 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ShowAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ShowAction.java @@ -28,19 +28,16 @@ import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.BranchType; -import org.sonar.db.component.ComponentDto; import org.sonar.db.newcodeperiod.NewCodePeriodDao; import org.sonar.db.newcodeperiod.NewCodePeriodDto; import org.sonar.db.newcodeperiod.NewCodePeriodType; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.user.UserSession; import org.sonarqube.ws.NewCodePeriods; -import static com.google.common.base.Preconditions.checkArgument; import static java.lang.String.format; -import static org.sonar.server.component.ComponentFinder.ParamNames.PROJECT_ID_AND_KEY; import static org.sonar.server.ws.WsUtils.writeProtobuf; import static org.sonarqube.ws.NewCodePeriods.ShowWSResponse; @@ -81,56 +78,52 @@ public class ShowAction implements NewCodePeriodsWsAction { @Override public void handle(Request request, Response response) throws Exception { - String projectStr = request.getParam(PARAM_PROJECT).emptyAsNull().or(() -> null); - String branchStr = request.getParam(PARAM_BRANCH).emptyAsNull().or(() -> null); + String projectKey = request.getParam(PARAM_PROJECT).emptyAsNull().or(() -> null); + String branchKey = request.getParam(PARAM_BRANCH).emptyAsNull().or(() -> null); - if (projectStr == null && branchStr != null) { + if (projectKey == null && branchKey != null) { throw new IllegalArgumentException("If branch key is specified, project key needs to be specified too"); } try (DbSession dbSession = dbClient.openSession(false)) { - - ComponentDto projectBranch; - String projectUuid = null; - String branchUuid = null; - - if (projectStr != null) { - projectBranch = getProject(dbSession, projectStr, branchStr); - userSession.checkComponentPermission(UserRole.ADMIN, projectBranch); - if (branchStr != null) { - branchUuid = projectBranch.uuid(); + ProjectDto project = null; + BranchDto branch = null; + + if (projectKey != null) { + project = getProject(dbSession, projectKey); + userSession.checkProjectPermission(UserRole.ADMIN, project); + if (branchKey != null) { + branch = getBranch(dbSession, project, branchKey); } - // depending whether it's the main branch or not - projectUuid = projectBranch.getMainBranchProjectUuid() != null ? projectBranch.getMainBranchProjectUuid() : projectBranch.uuid(); } - ShowWSResponse.Builder builder = get(dbSession, projectUuid, branchUuid, false); + ShowWSResponse.Builder builder = get(dbSession, project, branch, false); - if (projectStr != null) { - builder.setProjectKey(projectStr); + if (project != null) { + builder.setProjectKey(project.getKey()); } - if (branchStr != null) { - builder.setBranchKey(branchStr); + if (branch != null) { + builder.setBranchKey(branch.getKey()); } writeProtobuf(builder.build(), request, response); } } - private ShowWSResponse.Builder get(DbSession dbSession, @Nullable String projectUuid, @Nullable String branchUuid, boolean inherited) { - if (projectUuid == null) { + private ShowWSResponse.Builder get(DbSession dbSession, @Nullable ProjectDto project, @Nullable BranchDto branch, boolean inherited) { + if (project == null) { Optional<NewCodePeriodDto> dto = newCodePeriodDao.selectGlobal(dbSession); return dto.map(d -> build(d, inherited)) .orElseGet(() -> buildDefault(inherited)); } - if (branchUuid == null) { - Optional<NewCodePeriodDto> dto = newCodePeriodDao.selectByProject(dbSession, projectUuid); + if (branch == null) { + Optional<NewCodePeriodDto> dto = newCodePeriodDao.selectByProject(dbSession, project.getUuid()); return dto.map(d -> build(d, inherited)) .orElseGet(() -> get(dbSession, null, null, true)); } - Optional<NewCodePeriodDto> dto = newCodePeriodDao.selectByBranch(dbSession, projectUuid, branchUuid); + Optional<NewCodePeriodDto> dto = newCodePeriodDao.selectByBranch(dbSession, project.getUuid(), branch.getUuid()); return dto.map(d -> build(d, inherited)) - .orElseGet(() -> get(dbSession, projectUuid, null, true)); + .orElseGet(() -> get(dbSession, project, null, true)); } private static ShowWSResponse.Builder build(NewCodePeriodDto dto, boolean inherited) { @@ -163,19 +156,13 @@ public class ShowAction implements NewCodePeriodsWsAction { } } - private ComponentDto getProject(DbSession dbSession, String projectKey, @Nullable String branchKey) { - if (branchKey == null) { - return componentFinder.getByUuidOrKey(dbSession, null, projectKey, PROJECT_ID_AND_KEY); - } - ComponentDto project = componentFinder.getByKeyAndBranch(dbSession, projectKey, branchKey); - - BranchDto branchDto = dbClient.branchDao().selectByUuid(dbSession, project.uuid()) - .orElseThrow(() -> new NotFoundException(format("Branch '%s' is not found", branchKey))); - - checkArgument(branchDto.getBranchType() == BranchType.BRANCH, - "Not a branch: '%s'", branchKey); + private BranchDto getBranch(DbSession dbSession, ProjectDto project, String branchKey) { + return dbClient.branchDao().selectByBranchKey(dbSession, project.getUuid(), branchKey) + .orElseThrow(() -> new NotFoundException(format("Branch '%s' in project '%s' not found", branchKey, project.getKey()))); + } - return project; + private ProjectDto getProject(DbSession dbSession, String projectKey) { + return componentFinder.getProjectByKey(dbSession, projectKey); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/UnsetAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/UnsetAction.java index 9c90b647c47..b892d85f373 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/UnsetAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/UnsetAction.java @@ -19,7 +19,6 @@ */ package org.sonar.server.newcodeperiod.ws; -import javax.annotation.Nullable; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; @@ -29,16 +28,13 @@ import org.sonar.core.platform.PlatformEditionProvider; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.BranchType; -import org.sonar.db.component.ComponentDto; import org.sonar.db.newcodeperiod.NewCodePeriodDao; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.user.UserSession; -import static com.google.common.base.Preconditions.checkArgument; import static java.lang.String.format; -import static org.sonar.server.component.ComponentFinder.ParamNames.PROJECT_ID_AND_KEY; public class UnsetAction implements NewCodePeriodsWsAction { private static final String PARAM_BRANCH = "branch"; @@ -79,30 +75,30 @@ public class UnsetAction implements NewCodePeriodsWsAction { @Override public void handle(Request request, Response response) throws Exception { - String projectStr = request.getParam(PARAM_PROJECT).emptyAsNull().or(() -> null); - String branchStr = request.getParam(PARAM_BRANCH).emptyAsNull().or(() -> null); + String projectKey = request.getParam(PARAM_PROJECT).emptyAsNull().or(() -> null); + String branchKey = request.getParam(PARAM_BRANCH).emptyAsNull().or(() -> null); - if (projectStr == null && branchStr != null) { + if (projectKey == null && branchKey != null) { throw new IllegalArgumentException("If branch key is specified, project key needs to be specified too"); } try (DbSession dbSession = dbClient.openSession(false)) { String projectUuid = null; String branchUuid = null; - ComponentDto projectBranch; // in CE set main branch value instead of project value boolean isCommunityEdition = editionProvider.get().filter(t -> t == EditionProvider.Edition.COMMUNITY).isPresent(); - if (projectStr != null) { - projectBranch = getProject(dbSession, projectStr, branchStr); - userSession.checkComponentPermission(UserRole.ADMIN, projectBranch); + if (projectKey != null) { + ProjectDto project = getProject(dbSession, projectKey); + userSession.checkProjectPermission(UserRole.ADMIN, project); + projectUuid = project.getUuid(); - if (branchStr != null || isCommunityEdition) { - branchUuid = projectBranch.uuid(); + if (branchKey != null) { + branchUuid = getBranch(dbSession, project, branchKey).getUuid(); + } else if (isCommunityEdition) { + branchUuid = getMainBranch(dbSession, project).getUuid(); } - // depending whether it's the main branch or not - projectUuid = projectBranch.getMainBranchProjectUuid() != null ? projectBranch.getMainBranchProjectUuid() : projectBranch.uuid(); } else { userSession.checkIsSystemAdministrator(); } @@ -117,18 +113,19 @@ public class UnsetAction implements NewCodePeriodsWsAction { } } - private ComponentDto getProject(DbSession dbSession, String projectKey, @Nullable String branchKey) { - if (branchKey == null) { - return componentFinder.getByUuidOrKey(dbSession, null, projectKey, PROJECT_ID_AND_KEY); - } - ComponentDto project = componentFinder.getByKeyAndBranch(dbSession, projectKey, branchKey); - - BranchDto branchDto = dbClient.branchDao().selectByUuid(dbSession, project.uuid()) - .orElseThrow(() -> new NotFoundException(format("Branch '%s' is not found", branchKey))); + private BranchDto getMainBranch(DbSession dbSession, ProjectDto project) { + return dbClient.branchDao().selectByProject(dbSession, project) + .stream().filter(BranchDto::isMain) + .findFirst() + .orElseThrow(() -> new NotFoundException(format("Main branch in project '%s' not found", project.getKey()))); + } - checkArgument(branchDto.getBranchType() == BranchType.BRANCH, - "Not a branch: '%s'", branchKey); + private BranchDto getBranch(DbSession dbSession, ProjectDto project, String branchKey) { + return dbClient.branchDao().selectByBranchKey(dbSession, project.getUuid(), branchKey) + .orElseThrow(() -> new NotFoundException(format("Branch '%s' in project '%s' not found", branchKey, project.getKey()))); + } - return project; + private ProjectDto getProject(DbSession dbSession, String projectKey) { + return componentFinder.getProjectByKey(dbSession, projectKey); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/organization/ws/OrganizationDeleter.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/organization/ws/OrganizationDeleter.java index ede7b9924b4..48e91c1acd5 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/organization/ws/OrganizationDeleter.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/organization/ws/OrganizationDeleter.java @@ -23,16 +23,14 @@ import com.google.common.annotations.VisibleForTesting; import java.util.Collection; import java.util.List; import java.util.Set; -import org.sonar.api.resources.Qualifiers; -import org.sonar.api.resources.Scopes; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.organization.OrganizationQuery; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.user.UserDto; @@ -83,24 +81,17 @@ public class OrganizationDeleter { } private void deleteProjects(DbSession dbSession, OrganizationDto organization) { - List<ComponentDto> roots = dbClient.componentDao().selectProjectsByOrganization(dbSession, organization.getUuid()); + List<ProjectDto> projectDtos = dbClient.projectDao().selectByOrganizationUuid(dbSession, organization.getUuid()); try { - componentCleanerService.delete(dbSession, roots); + componentCleanerService.delete(dbSession, projectDtos); } finally { - Set<Project> projects = roots.stream() - .filter(OrganizationDeleter::isMainProject) + Set<Project> projects = projectDtos.stream() .map(Project::from) .collect(MoreCollectors.toSet()); projectLifeCycleListeners.onProjectsDeleted(projects); } } - private static boolean isMainProject(ComponentDto p) { - return Scopes.PROJECT.equals(p.scope()) - && Qualifiers.PROJECT.equals(p.qualifier()) - && p.getMainBranchProjectUuid() == null; - } - private void deletePermissions(DbSession dbSession, OrganizationDto organization) { dbClient.permissionTemplateDao().deleteByOrganization(dbSession, organization.getUuid()); dbClient.userPermissionDao().deleteByOrganization(dbSession, organization.getUuid()); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/BulkDeleteAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/BulkDeleteAction.java index 03089c46468..f338dd11d44 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/BulkDeleteAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/BulkDeleteAction.java @@ -20,7 +20,10 @@ package org.sonar.server.project.ws; import com.google.common.base.Strings; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.sonar.api.server.ws.Change; @@ -68,7 +71,7 @@ public class BulkDeleteAction implements ProjectsWsAction { private final ProjectLifeCycleListeners projectLifeCycleListeners; public BulkDeleteAction(ComponentCleanerService componentCleanerService, DbClient dbClient, UserSession userSession, - ProjectsWsSupport support, ProjectLifeCycleListeners projectLifeCycleListeners) { + ProjectsWsSupport support, ProjectLifeCycleListeners projectLifeCycleListeners) { this.componentCleanerService = componentCleanerService; this.dbClient = dbClient; this.userSession = userSession; @@ -112,7 +115,7 @@ public class BulkDeleteAction implements ProjectsWsAction { action.createParam(PARAM_VISIBILITY) .setDescription("Filter the projects that should be visible to everyone (%s), or only specific user/groups (%s).<br/>" + - "If no visibility is specified, the default project visibility of the organization will be used.", + "If no visibility is specified, the default project visibility of the organization will be used.", Visibility.PUBLIC.getLabel(), Visibility.PRIVATE.getLabel()) .setRequired(false) .setInternal(true) @@ -142,7 +145,9 @@ public class BulkDeleteAction implements ProjectsWsAction { checkAtLeastOneParameterIsPresent(searchRequest); ComponentQuery query = buildDbQuery(searchRequest); - List<ComponentDto> componentDtos = dbClient.componentDao().selectByQuery(dbSession, organization.getUuid(), query, 0, Integer.MAX_VALUE); + // TODO do query in ProjectDao + Set<ComponentDto> componentDtos = new HashSet<>(dbClient.componentDao().selectByQuery(dbSession, organization.getUuid(), query, 0, Integer.MAX_VALUE)); + try { componentDtos.forEach(p -> componentCleanerService.delete(dbSession, p)); } finally { diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/BulkUpdateKeyAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/BulkUpdateKeyAction.java index d4543402971..52aa30ebfed 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/BulkUpdateKeyAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/BulkUpdateKeyAction.java @@ -20,7 +20,6 @@ package org.sonar.server.project.ws; import com.google.common.collect.ImmutableList; -import java.util.Comparator; import java.util.Map; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; @@ -28,15 +27,14 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentKeyUpdaterDao; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.ComponentService; import org.sonar.server.user.UserSession; import org.sonarqube.ws.Projects.BulkUpdateKeyWsResponse; import static com.google.common.base.Preconditions.checkArgument; -import static org.sonar.db.component.ComponentKeyUpdaterDao.checkIsProjectOrModule; import static org.sonar.server.exceptions.BadRequestException.checkRequest; import static org.sonar.server.ws.WsUtils.writeProtobuf; import static org.sonarqube.ws.client.project.ProjectsWsParameters.ACTION_BULK_UPDATE_KEY; @@ -67,8 +65,8 @@ public class BulkUpdateKeyAction implements ProjectsWsAction { public WebService.NewAction doDefine(WebService.NewController context) { WebService.NewAction action = context.createAction(ACTION_BULK_UPDATE_KEY) - .setDescription("Bulk update a project or module key and all its sub-components keys. " + - "The bulk update allows to replace a part of the current key by another string on the current project and all its sub-modules.<br>" + + .setDescription("Bulk update a project key and all its sub-components keys. " + + "The bulk update allows to replace a part of the current key by another string on the current project.<br>" + "It's possible to simulate the bulk update by setting the parameter '%s' at true. No key is updated with a dry run.<br>" + "Ex: to rename a project with key 'my_project' to 'my_new_project' and all its sub-components keys, call the WS with parameters:" + "<ul>" + @@ -90,7 +88,7 @@ public class BulkUpdateKeyAction implements ProjectsWsAction { .setHandler(this); action.createParam(PARAM_PROJECT) - .setDescription("Project or module key") + .setDescription("Project key") .setRequired(true) .setExampleValue("my_old_project"); @@ -119,16 +117,15 @@ public class BulkUpdateKeyAction implements ProjectsWsAction { private BulkUpdateKeyWsResponse doHandle(BulkUpdateKeyRequest request) { try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto projectOrModule = componentFinder.getByKey(dbSession, request.getProjectKey()); - checkIsProjectOrModule(projectOrModule); - userSession.checkComponentPermission(UserRole.ADMIN, projectOrModule); + ProjectDto project = componentFinder.getProjectByKey(dbSession, request.getProjectKey()); + userSession.checkProjectPermission(UserRole.ADMIN, project); - Map<String, String> newKeysByOldKeys = componentKeyUpdater.simulateBulkUpdateKey(dbSession, projectOrModule.uuid(), request.getFrom(), request.getTo()); + Map<String, String> newKeysByOldKeys = componentKeyUpdater.simulateBulkUpdateKey(dbSession, project.getUuid(), request.getFrom(), request.getTo()); Map<String, Boolean> newKeysWithDuplicateMap = componentKeyUpdater.checkComponentKeys(dbSession, ImmutableList.copyOf(newKeysByOldKeys.values())); if (!request.isDryRun()) { checkNoDuplicate(newKeysWithDuplicateMap); - bulkUpdateKey(dbSession, request, projectOrModule); + bulkUpdateKey(dbSession, request, project); } return buildResponse(newKeysByOldKeys, newKeysWithDuplicateMap); @@ -139,8 +136,8 @@ public class BulkUpdateKeyAction implements ProjectsWsAction { newKeysWithDuplicateMap.forEach((key, value) -> checkRequest(!value, "Impossible to update key: a component with key \"%s\" already exists.", key)); } - private void bulkUpdateKey(DbSession dbSession, BulkUpdateKeyRequest request, ComponentDto projectOrModule) { - componentService.bulkUpdateKey(dbSession, projectOrModule, request.getFrom(), request.getTo()); + private void bulkUpdateKey(DbSession dbSession, BulkUpdateKeyRequest request, ProjectDto project) { + componentService.bulkUpdateKey(dbSession, project, request.getFrom(), request.getTo()); } private static BulkUpdateKeyWsResponse buildResponse(Map<String, String> newKeysByOldKeys, Map<String, Boolean> newKeysWithDuplicateMap) { @@ -148,7 +145,7 @@ public class BulkUpdateKeyAction implements ProjectsWsAction { newKeysByOldKeys.entrySet().stream() // sort by old key - .sorted(Comparator.comparing(Map.Entry::getKey)) + .sorted(Map.Entry.comparingByKey()) .forEach( entry -> { String newKey = entry.getValue(); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/DeleteAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/DeleteAction.java index 2f46fdad81b..70c68287e25 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/DeleteAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/DeleteAction.java @@ -25,8 +25,8 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentCleanerService; import org.sonar.server.component.ComponentFinder; import org.sonar.server.project.ProjectLifeCycleListeners; @@ -78,7 +78,7 @@ public class DeleteAction implements ProjectsWsAction { String key = request.mandatoryParam(PARAM_PROJECT); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = componentFinder.getByKey(dbSession, key); + ProjectDto project = componentFinder.getProjectByKey(dbSession, key); checkPermission(project); componentCleanerService.delete(dbSession, project); projectLifeCycleListeners.onProjectsDeleted(singleton(from(project))); @@ -87,8 +87,8 @@ public class DeleteAction implements ProjectsWsAction { response.noContent(); } - private void checkPermission(ComponentDto project) { - if (!userSession.hasComponentPermission(UserRole.ADMIN, project)) { + private void checkPermission(ProjectDto project) { + if (!userSession.hasProjectPermission(UserRole.ADMIN, project)) { userSession.checkPermission(OrganizationPermission.ADMINISTER, project.getOrganizationUuid()); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/SearchAction.java index 594ecf72167..4131aae98b5 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/SearchAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/SearchAction.java @@ -103,7 +103,7 @@ public class SearchAction implements ProjectsWsAction { action.createParam(PARAM_VISIBILITY) .setDescription("Filter the projects that should be visible to everyone (%s), or only specific user/groups (%s).<br/>" + - "If no visibility is specified, the default project visibility of the organization will be used.", + "If no visibility is specified, the default project visibility of the organization will be used.", Visibility.PUBLIC.getLabel(), Visibility.PRIVATE.getLabel()) .setRequired(false) .setInternal(true) diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateKeyAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateKeyAction.java index 5bf585445ca..01a20b78668 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateKeyAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateKeyAction.java @@ -27,6 +27,8 @@ import org.sonar.api.server.ws.WebService; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.ComponentService; import org.sonar.server.exceptions.NotFoundException; @@ -37,10 +39,12 @@ import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_TO; public class UpdateKeyAction implements ProjectsWsAction { private final DbClient dbClient; private final ComponentService componentService; + private final ComponentFinder componentFinder; - public UpdateKeyAction(DbClient dbClient, ComponentService componentService) { + public UpdateKeyAction(DbClient dbClient, ComponentService componentService, ComponentFinder componentFinder) { this.dbClient = dbClient; this.componentService = componentService; + this.componentFinder = componentFinder; } @Override @@ -50,7 +54,7 @@ public class UpdateKeyAction implements ProjectsWsAction { public WebService.NewAction doDefine(WebService.NewController context) { WebService.NewAction action = context.createAction(ACTION_UPDATE_KEY) - .setDescription("Update a project or module key and all its sub-components keys.<br>" + + .setDescription("Update a project all its sub-components keys.<br>" + "Requires one of the following permissions: " + "<ul>" + "<li>'Administer System'</li>" + @@ -64,12 +68,12 @@ public class UpdateKeyAction implements ProjectsWsAction { new Change("7.1", "Ability to update key of a disabled module")); action.createParam(PARAM_FROM) - .setDescription("Project or module key") + .setDescription("Project key") .setRequired(true) .setExampleValue("my_old_project"); action.createParam(PARAM_TO) - .setDescription("New component key") + .setDescription("New project key") .setRequired(true) .setExampleValue("my_new_project"); @@ -82,13 +86,8 @@ public class UpdateKeyAction implements ProjectsWsAction { String newKey = request.mandatoryParam(PARAM_TO); try (DbSession dbSession = dbClient.openSession(false)) { - Optional<ComponentDto> component; - component = dbClient.componentDao().selectByKey(dbSession, key); - if (!component.isPresent() || component.get().getMainBranchProjectUuid() != null) { - throw new NotFoundException("Component not found"); - } - - componentService.updateKey(dbSession, component.get(), newKey); + ProjectDto project = componentFinder.getProjectByKey(dbSession, key); + componentService.updateKey(dbSession, project, newKey); } response.noContent(); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java index 444c5fc9d65..5c756f50c44 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java @@ -69,8 +69,8 @@ public class UpdateVisibilityAction implements ProjectsWsAction { public void define(WebService.NewController context) { WebService.NewAction action = context.createAction(ProjectsWsParameters.ACTION_UPDATE_VISIBILITY) - .setDescription("Updates visibility of a project.<br>" + - "Requires 'Project administer' permission on the specified project") + .setDescription("Updates visibility of a project or view.<br>" + + "Requires 'Project administer' permission on the specified project or view") .setSince("6.4") .setPost(true) .setHandler(this); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java index ace4fcea7e9..d61f0bdb2d3 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java @@ -19,13 +19,10 @@ */ package org.sonar.server.projectanalysis.ws; -import com.google.common.collect.ImmutableSet; import java.util.List; -import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import org.sonar.api.resources.Qualifiers; -import org.sonar.api.resources.Scopes; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; @@ -35,16 +32,15 @@ import org.sonar.core.util.UuidFactory; import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.component.SnapshotDto; import org.sonar.db.event.EventDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.user.UserSession; import org.sonarqube.ws.ProjectAnalyses.CreateEventResponse; import org.sonarqube.ws.ProjectAnalyses.Event; import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; import static java.util.Optional.ofNullable; import static org.sonar.db.event.EventValidator.MAX_NAME_LENGTH; @@ -58,8 +54,6 @@ import static org.sonar.server.projectanalysis.ws.ProjectAnalysesWsParameters.PA import static org.sonar.server.ws.WsUtils.writeProtobuf; public class CreateEventAction implements ProjectAnalysesWsAction { - private static final Set<String> ALLOWED_QUALIFIERS = ImmutableSet.of(Qualifiers.PROJECT, Qualifiers.APP); - private final DbClient dbClient; private final UuidFactory uuidFactory; private final System2 system; @@ -76,12 +70,12 @@ public class CreateEventAction implements ProjectAnalysesWsAction { public void define(WebService.NewController context) { WebService.NewAction action = context.createAction("create_event") .setDescription("Create a project analysis event.<br>" + - "Only event of category '%s' and '%s' can be created.<br>" + - "Requires one of the following permissions:" + - "<ul>" + - " <li>'Administer System'</li>" + - " <li>'Administer' rights on the specified project</li>" + - "</ul>", + "Only event of category '%s' and '%s' can be created.<br>" + + "Requires one of the following permissions:" + + "<ul>" + + " <li>'Administer System'</li>" + + " <li>'Administer' rights on the specified project</li>" + + "</ul>", VERSION.name(), OTHER.name()) .setSince("6.3") .setPost(true) @@ -116,7 +110,7 @@ public class CreateEventAction implements ProjectAnalysesWsAction { private CreateEventResponse doHandle(CreateEventRequest request) { try (DbSession dbSession = dbClient.openSession(false)) { SnapshotDto analysis = getAnalysis(dbSession, request); - ComponentDto project = getProjectOrApplication(dbSession, analysis); + ProjectDto project = getProjectOrApplication(dbSession, analysis); checkRequest(request, project); checkExistingDbEvents(dbSession, request, analysis); EventDto dbEvent = insertDbEvent(dbSession, request, analysis); @@ -139,17 +133,14 @@ public class CreateEventAction implements ProjectAnalysesWsAction { .orElseThrow(() -> new NotFoundException(format("Analysis '%s' is not found", request.getAnalysis()))); } - private ComponentDto getProjectOrApplication(DbSession dbSession, SnapshotDto analysis) { - ComponentDto project = dbClient.componentDao().selectByUuid(dbSession, analysis.getComponentUuid()).orElse(null); - checkState(project != null, "Project of analysis '%s' is not found", analysis.getUuid()); - checkArgument(ALLOWED_QUALIFIERS.contains(project.qualifier()) && Scopes.PROJECT.equals(project.scope()), - "An event must be created on a project or an application"); - return project; + private ProjectDto getProjectOrApplication(DbSession dbSession, SnapshotDto analysis) { + return dbClient.projectDao().selectByUuid(dbSession, analysis.getComponentUuid()) + .orElseThrow(() -> new IllegalStateException(String.format("Project of analysis '%s' is not found", analysis.getUuid()))); } - private void checkRequest(CreateEventRequest request, ComponentDto component) { - userSession.checkComponentPermission(UserRole.ADMIN, component); - checkArgument(EventCategory.VERSION != request.getCategory() || Qualifiers.PROJECT.equals(component.qualifier()), "A version event must be created on a project"); + private void checkRequest(CreateEventRequest request, ProjectDto project) { + userSession.checkProjectPermission(UserRole.ADMIN, project); + checkArgument(EventCategory.VERSION != request.getCategory() || Qualifiers.PROJECT.equals(project.getQualifier()), "A version event must be created on a project"); checkVersionName(request.getCategory(), request.getName()); } 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 369a4afa92f..61bcdbb9ae1 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 @@ -28,11 +28,12 @@ import org.sonar.api.web.UserRole; import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.db.component.BranchDao; 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.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.user.UserSession; @@ -40,7 +41,6 @@ import org.sonar.server.user.UserSession; import static com.google.common.base.Preconditions.checkArgument; import static java.lang.String.format; import static org.apache.commons.lang.StringUtils.trimToNull; -import static org.sonar.server.component.ComponentFinder.ParamNames.PROJECT_ID_AND_KEY; 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; @@ -50,11 +50,13 @@ public class SetBaselineAction implements ProjectAnalysesWsAction { private final DbClient dbClient; private final UserSession userSession; private final ComponentFinder componentFinder; + private final BranchDao branchDao; - public SetBaselineAction(DbClient dbClient, UserSession userSession, ComponentFinder componentFinder) { + public SetBaselineAction(DbClient dbClient, UserSession userSession, ComponentFinder componentFinder, BranchDao branchDao) { this.dbClient = dbClient; this.userSession = userSession; this.componentFinder = componentFinder; + this.branchDao = branchDao; } @Override @@ -98,13 +100,14 @@ public class SetBaselineAction implements ProjectAnalysesWsAction { String analysisUuid = request.mandatoryParam(PARAM_ANALYSIS); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto projectBranch = getProjectBranch(dbSession, projectKey, branchKey); + ProjectDto project = componentFinder.getProjectByKey(dbSession, projectKey); + BranchDto branch = loadBranch(dbSession, project, branchKey); SnapshotDto analysis = getAnalysis(dbSession, analysisUuid); - checkRequest(dbSession, projectBranch, branchKey, analysis); + checkRequest(project, branch, analysis, branchKey); dbClient.newCodePeriodDao().upsert(dbSession, new NewCodePeriodDto() - .setProjectUuid(projectBranch.getMainBranchProjectUuid() != null ? projectBranch.getMainBranchProjectUuid() : projectBranch.uuid()) - .setBranchUuid(projectBranch.uuid()) + .setProjectUuid(project.getUuid()) + .setBranchUuid(branch.getUuid()) .setType(NewCodePeriodType.SPECIFIC_ANALYSIS) .setValue(analysisUuid) ); @@ -112,16 +115,14 @@ public class SetBaselineAction implements ProjectAnalysesWsAction { } } - private ComponentDto getProjectBranch(DbSession dbSession, String projectKey, @Nullable String branchKey) { - if (branchKey == null) { - return componentFinder.getByUuidOrKey(dbSession, null, projectKey, PROJECT_ID_AND_KEY); + private BranchDto loadBranch(DbSession dbSession, ProjectDto project, @Nullable String branchKey) { + if (branchKey != null) { + return branchDao.selectByBranchKey(dbSession, project.getUuid(), branchKey) + .orElseThrow(() -> new NotFoundException(String.format("Branch '%s' in project '%s' not found", branchKey, project.getKey()))); } - ComponentDto project = componentFinder.getByKeyAndBranch(dbSession, projectKey, branchKey); - - BranchDto branchDto = dbClient.branchDao().selectByUuid(dbSession, project.uuid()) - .orElseThrow(() -> new NotFoundException(format("Branch '%s' is not found", branchKey))); - return project; + return branchDao.selectByUuid(dbSession, project.getUuid()) + .orElseThrow(() -> new NotFoundException(String.format("Main branch in project '%s' not found", project.getKey()))); } private SnapshotDto getAnalysis(DbSession dbSession, String analysisUuid) { @@ -129,19 +130,18 @@ public class SetBaselineAction implements ProjectAnalysesWsAction { .orElseThrow(() -> new NotFoundException(format("Analysis '%s' is not found", analysisUuid))); } - private void checkRequest(DbSession dbSession, ComponentDto projectBranch, @Nullable String branchKey, SnapshotDto analysis) { - userSession.checkComponentPermission(UserRole.ADMIN, projectBranch); - ComponentDto project = dbClient.componentDao().selectByUuid(dbSession, analysis.getComponentUuid()).orElse(null); + private void checkRequest(ProjectDto project, BranchDto branchDto, SnapshotDto analysis, @Nullable String branchKey) { + userSession.checkProjectPermission(UserRole.ADMIN, project); - boolean analysisMatchesProjectBranch = project != null && projectBranch.uuid().equals(project.uuid()); + boolean analysisMatchesBranch = analysis.getComponentUuid().equals(branchDto.getUuid()); if (branchKey != null) { - checkArgument(analysisMatchesProjectBranch, + checkArgument(analysisMatchesBranch, "Analysis '%s' does not belong to branch '%s' of project '%s'", - analysis.getUuid(), branchKey, projectBranch.getKey()); + analysis.getUuid(), branchKey, project.getKey()); } else { - checkArgument(analysisMatchesProjectBranch, - "Analysis '%s' does not belong to project '%s'", - analysis.getUuid(), projectBranch.getKey()); + checkArgument(analysisMatchesBranch, + "Analysis '%s' does not belong to main branch of project '%s'", + analysis.getUuid(), project.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 8de12bb217a..1fa332f684c 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 @@ -27,13 +27,13 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.db.component.BranchDao; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.user.UserSession; -import static java.lang.String.format; import static org.apache.commons.lang.StringUtils.trimToNull; import static org.sonar.server.projectanalysis.ws.ProjectAnalysesWsParameters.PARAM_BRANCH; import static org.sonar.server.projectanalysis.ws.ProjectAnalysesWsParameters.PARAM_PROJECT; @@ -43,11 +43,13 @@ public class UnsetBaselineAction implements ProjectAnalysesWsAction { private final DbClient dbClient; private final UserSession userSession; private final ComponentFinder componentFinder; + private final BranchDao branchDao; - public UnsetBaselineAction(DbClient dbClient, UserSession userSession, ComponentFinder componentFinder) { + public UnsetBaselineAction(DbClient dbClient, UserSession userSession, ComponentFinder componentFinder, BranchDao branchDao) { this.dbClient = dbClient; this.userSession = userSession; this.componentFinder = componentFinder; + this.branchDao = branchDao; } @Override @@ -85,26 +87,23 @@ public class UnsetBaselineAction implements ProjectAnalysesWsAction { String branchKey = trimToNull(request.param(PARAM_BRANCH)); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto projectBranch = getProjectBranch(dbSession, projectKey, branchKey); - userSession.checkComponentPermission(UserRole.ADMIN, projectBranch); + ProjectDto project = componentFinder.getProjectByKey(dbSession, projectKey); + userSession.checkProjectPermission(UserRole.ADMIN, project); - String projectUuid = projectBranch.getMainBranchProjectUuid() != null ? projectBranch.getMainBranchProjectUuid() : projectBranch.uuid(); - String branchUuid = projectBranch.uuid(); - dbClient.newCodePeriodDao().delete(dbSession, projectUuid, branchUuid); + BranchDto branch = loadBranch(dbSession, project, branchKey); + dbClient.newCodePeriodDao().delete(dbSession, project.getUuid(), branch.getUuid()); dbSession.commit(); } } - private ComponentDto getProjectBranch(DbSession dbSession, String projectKey, @Nullable String branchKey) { - if (branchKey == null) { - return componentFinder.getByKey(dbSession, projectKey); + private BranchDto loadBranch(DbSession dbSession, ProjectDto project, @Nullable String branchKey) { + if (branchKey != null) { + return branchDao.selectByBranchKey(dbSession, project.getUuid(), branchKey) + .orElseThrow(() -> new NotFoundException(String.format("Branch '%s' in project '%s' not found", branchKey, project.getKey()))); } - ComponentDto project = componentFinder.getByKeyAndBranch(dbSession, projectKey, branchKey); - BranchDto branchDto = dbClient.branchDao().selectByUuid(dbSession, project.uuid()) - .orElseThrow(() -> new NotFoundException(format("Branch '%s' is not found", branchKey))); - - return project; + return branchDao.selectByUuid(dbSession, project.getUuid()) + .orElseThrow(() -> new NotFoundException(String.format("Main branch in project '%s' not found", project.getKey()))); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/CreateAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/CreateAction.java index 921d2e80a1f..f6e99a848e2 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/CreateAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/CreateAction.java @@ -26,8 +26,8 @@ import org.sonar.api.web.UserRole; import org.sonar.core.util.UuidFactory; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ProjectLinkDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; import org.sonarqube.ws.ProjectLinks; @@ -35,7 +35,6 @@ import org.sonarqube.ws.ProjectLinks.CreateWsResponse; import static org.sonar.core.util.Slug.slugify; import static org.sonar.core.util.Uuids.UUID_EXAMPLE_01; -import static org.sonar.server.projectlink.ws.ProjectLinksWs.checkProject; import static org.sonar.server.projectlink.ws.ProjectLinksWsParameters.ACTION_CREATE; import static org.sonar.server.projectlink.ws.ProjectLinksWsParameters.PARAM_NAME; import static org.sonar.server.projectlink.ws.ProjectLinksWsParameters.PARAM_PROJECT_ID; @@ -105,13 +104,13 @@ public class CreateAction implements ProjectLinksWsAction { String url = createWsRequest.getUrl(); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto component = checkProject(getComponentByUuidOrKey(dbSession, createWsRequest)); + ProjectDto project = getProject(dbSession, createWsRequest); - userSession.checkComponentPermission(UserRole.ADMIN, component); + userSession.checkProjectPermission(UserRole.ADMIN, project); ProjectLinkDto link = new ProjectLinkDto() .setUuid(uuidFactory.create()) - .setProjectUuid(component.uuid()) + .setProjectUuid(project.getUuid()) .setName(name) .setHref(url) .setType(nameToType(name)); @@ -131,8 +130,8 @@ public class CreateAction implements ProjectLinksWsAction { .build(); } - private ComponentDto getComponentByUuidOrKey(DbSession dbSession, CreateRequest request) { - return componentFinder.getByUuidOrKey( + private ProjectDto getProject(DbSession dbSession, CreateRequest request) { + return componentFinder.getProjectByUuidOrKey( dbSession, request.getProjectId(), request.getProjectKey(), diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/ProjectLinksWs.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/ProjectLinksWs.java index 6d5ca63833e..e7af66a794f 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/ProjectLinksWs.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/ProjectLinksWs.java @@ -19,13 +19,7 @@ */ package org.sonar.server.projectlink.ws; -import org.sonar.api.resources.Qualifiers; -import org.sonar.api.resources.Scopes; import org.sonar.api.server.ws.WebService; -import org.sonar.db.component.ComponentDto; - -import static java.lang.String.format; -import static org.sonar.server.exceptions.BadRequestException.checkRequest; public class ProjectLinksWs implements WebService { @@ -47,11 +41,4 @@ public class ProjectLinksWs implements WebService { controller.done(); } - - static ComponentDto checkProject(ComponentDto component) { - checkRequest(component.scope().equals(Scopes.PROJECT) && component.qualifier().equals(Qualifiers.PROJECT), - format("Component '%s' must be a project.", component.getKey())); - return component; - } - } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/SearchAction.java index 1b40dac062c..cfb24fa49af 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/SearchAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/SearchAction.java @@ -27,8 +27,8 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ProjectLinkDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; import org.sonarqube.ws.ProjectLinks.Link; @@ -36,7 +36,6 @@ import org.sonarqube.ws.ProjectLinks.SearchWsResponse; import static java.util.Optional.ofNullable; import static org.sonar.core.util.Uuids.UUID_EXAMPLE_01; -import static org.sonar.server.projectlink.ws.ProjectLinksWs.checkProject; import static org.sonar.server.projectlink.ws.ProjectLinksWsParameters.ACTION_SEARCH; import static org.sonar.server.projectlink.ws.ProjectLinksWsParameters.PARAM_PROJECT_ID; import static org.sonar.server.projectlink.ws.ProjectLinksWsParameters.PARAM_PROJECT_KEY; @@ -59,13 +58,13 @@ public class SearchAction implements ProjectLinksWsAction { public void define(WebService.NewController context) { WebService.NewAction action = context.createAction(ACTION_SEARCH) .setDescription("List links of a project.<br>" + - "The '%s' or '%s' must be provided.<br>" + - "Requires one of the following permissions:" + - "<ul>" + - "<li>'Administer System'</li>" + - "<li>'Administer' rights on the specified project</li>" + - "<li>'Browse' on the specified project</li>" + - "</ul>", + "The '%s' or '%s' must be provided.<br>" + + "Requires one of the following permissions:" + + "<ul>" + + "<li>'Administer System'</li>" + + "<li>'Administer' rights on the specified project</li>" + + "<li>'Browse' on the specified project</li>" + + "</ul>", PARAM_PROJECT_ID, PARAM_PROJECT_KEY) .setHandler(this) .setResponseExample(getClass().getResource("search-example.json")) @@ -90,9 +89,9 @@ public class SearchAction implements ProjectLinksWsAction { private SearchWsResponse doHandle(SearchRequest searchWsRequest) { try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto component = getComponentByUuidOrKey(dbSession, searchWsRequest); + ProjectDto project = getProjectByUuidOrKey(dbSession, searchWsRequest); List<ProjectLinkDto> links = dbClient.projectLinkDao() - .selectByProjectUuid(dbSession, component.uuid()); + .selectByProjectUuid(dbSession, project.getUuid()); return buildResponse(links); } } @@ -114,17 +113,17 @@ public class SearchAction implements ProjectLinksWsAction { return builder.build(); } - private ComponentDto getComponentByUuidOrKey(DbSession dbSession, SearchRequest request) { - ComponentDto component = componentFinder.getByUuidOrKey( + private ProjectDto getProjectByUuidOrKey(DbSession dbSession, SearchRequest request) { + ProjectDto project = componentFinder.getProjectByUuidOrKey( dbSession, request.getProjectId(), request.getProjectKey(), ComponentFinder.ParamNames.PROJECT_ID_AND_KEY); - if (!userSession.hasComponentPermission(UserRole.ADMIN, component) && - !userSession.hasComponentPermission(UserRole.USER, component)) { + if (!userSession.hasProjectPermission(UserRole.ADMIN, project) && + !userSession.hasProjectPermission(UserRole.USER, project)) { throw insufficientPrivilegesException(); } - return checkProject(component); + return project; } private static SearchRequest toSearchWsRequest(Request request) { diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projecttag/ws/SetAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projecttag/ws/SetAction.java index 99757085346..79bbc3458bf 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projecttag/ws/SetAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projecttag/ws/SetAction.java @@ -25,20 +25,21 @@ import org.apache.commons.lang.StringUtils; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; +import org.sonar.api.utils.System2; import org.sonar.api.web.UserRole; import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.es.ProjectIndexers; import org.sonar.server.user.UserSession; import static java.util.Collections.singletonList; -import static org.sonar.api.resources.Qualifiers.PROJECT; import static org.sonar.server.es.ProjectIndexer.Cause.PROJECT_TAGS_UPDATE; -import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; import static org.sonar.server.exceptions.BadRequestException.checkRequest; +import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; public class SetAction implements ProjectTagsWsAction { /** @@ -53,12 +54,14 @@ public class SetAction implements ProjectTagsWsAction { private final ComponentFinder componentFinder; private final UserSession userSession; private final ProjectIndexers projectIndexers; + private final System2 system2; - public SetAction(DbClient dbClient, ComponentFinder componentFinder, UserSession userSession, ProjectIndexers projectIndexers) { + public SetAction(DbClient dbClient, ComponentFinder componentFinder, UserSession userSession, ProjectIndexers projectIndexers, System2 system2) { this.dbClient = dbClient; this.componentFinder = componentFinder; this.userSession = userSession; this.projectIndexers = projectIndexers; + this.system2 = system2; } @Override @@ -92,13 +95,19 @@ public class SetAction implements ProjectTagsWsAction { .collect(MoreCollectors.toList()); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = componentFinder.getByKey(dbSession, projectKey); - checkRequest(PROJECT.equals(project.qualifier()), "Component '%s' is not a project", project.getDbKey()); - userSession.checkComponentPermission(UserRole.ADMIN, project); + ProjectDto project = componentFinder.getProjectByKey(dbSession, projectKey); + userSession.checkProjectPermission(UserRole.ADMIN, project); + + ComponentDto component = componentFinder.getByKey(dbSession, projectKey); project.setTags(tags); - dbClient.componentDao().updateTags(dbSession, project); - projectIndexers.commitAndIndex(dbSession, singletonList(project), PROJECT_TAGS_UPDATE); + project.setUpdatedAt(system2.now()); + dbClient.projectDao().updateTags(dbSession, project); + + // FIXME we use the old table to index and also when returning generic components, so we still need to add it to the old table. + component.setTags(tags); + dbClient.componentDao().updateTags(dbSession, component); + projectIndexers.commitAndIndexProjects(dbSession, singletonList(project), PROJECT_TAGS_UPDATE); } response.noContent(); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/DeselectAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/DeselectAction.java index 19449cf500d..2285db6964e 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/DeselectAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/DeselectAction.java @@ -19,8 +19,6 @@ */ package org.sonar.server.qualitygate.ws; -import java.util.Optional; -import javax.annotation.Nullable; import org.sonar.api.server.ws.Change; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; @@ -28,9 +26,8 @@ import org.sonar.api.server.ws.WebService; import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; -import org.sonar.server.component.ComponentFinder; +import org.sonar.db.project.ProjectDto; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_PROJECT_ID; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_PROJECT_KEY; @@ -39,13 +36,11 @@ import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; public class DeselectAction implements QualityGatesWsAction { private final DbClient dbClient; - private final ComponentFinder componentFinder; private final QualityGatesWsSupport wsSupport; - public DeselectAction(DbClient dbClient, ComponentFinder componentFinder, QualityGatesWsSupport wsSupport) { + public DeselectAction(DbClient dbClient, QualityGatesWsSupport wsSupport) { this.wsSupport = wsSupport; this.dbClient = dbClient; - this.componentFinder = componentFinder; } @Override @@ -79,36 +74,15 @@ public class DeselectAction implements QualityGatesWsAction { public void handle(Request request, Response response) { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganization(dbSession, request); - ComponentDto project = getProject(dbSession, organization, request.param(PARAM_PROJECT_ID), request.param(PARAM_PROJECT_KEY)); + ProjectDto project = wsSupport.getProject(dbSession, organization, request.param(PARAM_PROJECT_KEY), request.param(PARAM_PROJECT_ID)); dissociateProject(dbSession, organization, project); response.noContent(); } } - private void dissociateProject(DbSession dbSession, OrganizationDto organization, ComponentDto project) { + private void dissociateProject(DbSession dbSession, OrganizationDto organization, ProjectDto project) { wsSupport.checkCanAdminProject(organization, project); - dbClient.projectQgateAssociationDao().deleteByProjectUuid(dbSession, project.uuid()); + dbClient.projectQgateAssociationDao().deleteByProjectUuid(dbSession, project.getUuid()); dbSession.commit(); } - - private ComponentDto getProject(DbSession dbSession, OrganizationDto organization, @Nullable String projectId, @Nullable String projectKey) { - ComponentDto project = selectProjectById(dbSession, projectId) - .orElseGet(() -> componentFinder.getByUuidOrKey(dbSession, projectId, projectKey, ComponentFinder.ParamNames.PROJECT_ID_AND_KEY)); - wsSupport.checkProjectBelongsToOrganization(organization, project); - return project; - } - - private Optional<ComponentDto> selectProjectById(DbSession dbSession, @Nullable String projectId) { - if (projectId == null) { - return Optional.empty(); - } - - try { - long dbId = Long.parseLong(projectId); - return dbClient.componentDao().selectById(dbSession, dbId); - } catch (NumberFormatException e) { - return Optional.empty(); - } - } - } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/GetByProjectAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/GetByProjectAction.java index 24b695919d2..4109a8596ce 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/GetByProjectAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/GetByProjectAction.java @@ -25,8 +25,8 @@ import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; @@ -91,12 +91,12 @@ public class GetByProjectAction implements QualityGatesWsAction { public void handle(Request request, Response response) throws Exception { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganization(dbSession, request); - ComponentDto project = componentFinder.getByKey(dbSession, request.mandatoryParam(PARAM_PROJECT)); + ProjectDto project = componentFinder.getProjectByKey(dbSession, request.mandatoryParam(PARAM_PROJECT)); // As ComponentFinder doesn't handle organization yet, we only check here that the project belongs to the organization wsSupport.checkProjectBelongsToOrganization(organization, project); - if (!userSession.hasComponentPermission(USER, project) && - !userSession.hasComponentPermission(ADMIN, project)) { + if (!userSession.hasProjectPermission(USER, project) && + !userSession.hasProjectPermission(ADMIN, project)) { throw insufficientPrivilegesException(); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java index 84764f0fbae..65fbc212a6d 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java @@ -33,10 +33,11 @@ import org.sonar.api.web.UserRole; import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.component.BranchDto; import org.sonar.db.component.SnapshotDto; import org.sonar.db.measure.LiveMeasureDto; import org.sonar.db.measure.MeasureDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.user.UserSession; @@ -44,6 +45,8 @@ import org.sonar.server.ws.KeyExamples; import org.sonarqube.ws.Qualitygates.ProjectStatusResponse; import static com.google.common.base.Strings.isNullOrEmpty; +import static org.sonar.server.exceptions.BadRequestException.checkRequest; +import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.ACTION_PROJECT_STATUS; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_ANALYSIS_ID; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_BRANCH; @@ -51,8 +54,6 @@ import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_PRO import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_PROJECT_KEY; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_PULL_REQUEST; import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException; -import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; -import static org.sonar.server.exceptions.BadRequestException.checkRequest; import static org.sonar.server.ws.WsUtils.writeProtobuf; public class ProjectStatusAction implements QualityGatesWsAction { @@ -138,9 +139,9 @@ public class ProjectStatusAction implements QualityGatesWsAction { } } - private ProjectStatusResponse doHandle(DbSession dbSession, @Nullable String analysisId, @Nullable String projectId, + private ProjectStatusResponse doHandle(DbSession dbSession, @Nullable String analysisId, @Nullable String projectUuid, @Nullable String projectKey, @Nullable String branchKey, @Nullable String pullRequestId) { - ProjectAndSnapshot projectAndSnapshot = getProjectAndSnapshot(dbSession, analysisId, projectId, projectKey, branchKey, pullRequestId); + ProjectAndSnapshot projectAndSnapshot = getProjectAndSnapshot(dbSession, analysisId, projectUuid, projectKey, branchKey, pullRequestId); checkPermission(projectAndSnapshot.project); Optional<String> measureData = loadQualityGateDetails(dbSession, projectAndSnapshot, analysisId != null); @@ -149,34 +150,42 @@ public class ProjectStatusAction implements QualityGatesWsAction { .build(); } - private ProjectAndSnapshot getProjectAndSnapshot(DbSession dbSession, @Nullable String analysisId, @Nullable String projectId, + private ProjectAndSnapshot getProjectAndSnapshot(DbSession dbSession, @Nullable String analysisId, @Nullable String projectUuid, @Nullable String projectKey, @Nullable String branchKey, @Nullable String pullRequestId) { if (!isNullOrEmpty(analysisId)) { return getSnapshotThenProject(dbSession, analysisId); } - if (!isNullOrEmpty(projectId) ^ !isNullOrEmpty(projectKey)) { - return getProjectThenSnapshot(dbSession, projectId, projectKey, branchKey, pullRequestId); + if (!isNullOrEmpty(projectUuid) ^ !isNullOrEmpty(projectKey)) { + return getProjectThenSnapshot(dbSession, projectUuid, projectKey, branchKey, pullRequestId); } throw BadRequestException.create(MSG_ONE_PROJECT_PARAMETER_ONLY); } - private ProjectAndSnapshot getProjectThenSnapshot(DbSession dbSession, @Nullable String projectId, @Nullable String projectKey, + private ProjectAndSnapshot getProjectThenSnapshot(DbSession dbSession, @Nullable String projectUuid, @Nullable String projectKey, @Nullable String branchKey, @Nullable String pullRequestId) { - ComponentDto projectDto; - if (projectId != null) { - projectDto = componentFinder.getRootComponentByUuidOrKey(dbSession, projectId, null); + ProjectDto projectDto; + BranchDto branchDto; + + if (projectUuid != null) { + projectDto = componentFinder.getProjectByUuid(dbSession, projectUuid); + branchDto = componentFinder.getMainBranch(dbSession, projectDto); } else { - projectDto = componentFinder.getByKeyAndOptionalBranchOrPullRequest(dbSession, projectKey, branchKey, pullRequestId); + projectDto = componentFinder.getProjectByKey(dbSession, projectKey); + branchDto = componentFinder.getBranchOrPullRequest(dbSession, projectDto, branchKey, pullRequestId); } - Optional<SnapshotDto> snapshot = dbClient.snapshotDao().selectLastAnalysisByRootComponentUuid(dbSession, projectDto.projectUuid()); - return new ProjectAndSnapshot(projectDto, snapshot.orElse(null)); + Optional<SnapshotDto> snapshot = dbClient.snapshotDao().selectLastAnalysisByRootComponentUuid(dbSession, branchDto.getUuid()); + return new ProjectAndSnapshot(projectDto, branchDto, snapshot.orElse(null)); } private ProjectAndSnapshot getSnapshotThenProject(DbSession dbSession, String analysisUuid) { SnapshotDto snapshotDto = getSnapshot(dbSession, analysisUuid); - ComponentDto projectDto = dbClient.componentDao().selectOrFailByUuid(dbSession, snapshotDto.getComponentUuid()); - return new ProjectAndSnapshot(projectDto, snapshotDto); + BranchDto branchDto = dbClient.branchDao().selectByUuid(dbSession, snapshotDto.getComponentUuid()) + .orElseThrow(() -> new IllegalStateException(String.format("Branch '%s' not found", snapshotDto.getUuid()))); + ProjectDto projectDto = dbClient.projectDao().selectByUuid(dbSession, branchDto.getProjectUuid()) + .orElseThrow(() -> new IllegalStateException(String.format("Project '%s' not found", branchDto.getProjectUuid()))); + + return new ProjectAndSnapshot(projectDto, branchDto, snapshotDto); } private SnapshotDto getSnapshot(DbSession dbSession, String analysisUuid) { @@ -191,29 +200,31 @@ public class ProjectStatusAction implements QualityGatesWsAction { } // get the gate status as it was computed during the specified analysis String analysisUuid = projectAndSnapshot.snapshotDto.get().getUuid(); - return dbClient.measureDao().selectMeasure(dbSession, analysisUuid, projectAndSnapshot.project.projectUuid(), CoreMetrics.QUALITY_GATE_DETAILS_KEY) + return dbClient.measureDao().selectMeasure(dbSession, analysisUuid, projectAndSnapshot.branch.getUuid(), CoreMetrics.QUALITY_GATE_DETAILS_KEY) .map(MeasureDto::getData); } // do not restrict to a specified analysis, use the live measure - Optional<LiveMeasureDto> measure = dbClient.liveMeasureDao().selectMeasure(dbSession, projectAndSnapshot.project.projectUuid(), CoreMetrics.QUALITY_GATE_DETAILS_KEY); + Optional<LiveMeasureDto> measure = dbClient.liveMeasureDao().selectMeasure(dbSession, projectAndSnapshot.branch.getUuid(), CoreMetrics.QUALITY_GATE_DETAILS_KEY); return measure.map(LiveMeasureDto::getDataAsString); } - private void checkPermission(ComponentDto project) { - if (!userSession.hasComponentPermission(UserRole.ADMIN, project) && - !userSession.hasComponentPermission(UserRole.USER, project)) { + private void checkPermission(ProjectDto project) { + if (!userSession.hasProjectPermission(UserRole.ADMIN, project) && + !userSession.hasProjectPermission(UserRole.USER, project)) { throw insufficientPrivilegesException(); } } @Immutable private static class ProjectAndSnapshot { - private final ComponentDto project; + private final BranchDto branch; private final Optional<SnapshotDto> snapshotDto; + private final ProjectDto project; - private ProjectAndSnapshot(ComponentDto project, @Nullable SnapshotDto snapshotDto) { + private ProjectAndSnapshot(ProjectDto project, BranchDto branch, @Nullable SnapshotDto snapshotDto) { this.project = project; + this.branch = branch; this.snapshotDto = Optional.ofNullable(snapshotDto); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWsSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWsSupport.java index 585d1b2749f..55fdd97c354 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWsSupport.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWsSupport.java @@ -26,11 +26,12 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService.NewAction; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.organization.DefaultOrganizationProvider; import org.sonar.server.user.UserSession; @@ -41,21 +42,25 @@ import static java.lang.String.format; import static org.sonar.api.web.UserRole.ADMIN; import static org.sonar.db.organization.OrganizationDto.Subscription.PAID; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_GATES; -import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_ORGANIZATION; -import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException; import static org.sonar.server.exceptions.NotFoundException.checkFound; import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; +import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_ORGANIZATION; +import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_PROJECT_ID; +import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_PROJECT_KEY; +import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException; public class QualityGatesWsSupport { private final DbClient dbClient; private final UserSession userSession; private final DefaultOrganizationProvider defaultOrganizationProvider; + private final ComponentFinder componentFinder; - public QualityGatesWsSupport(DbClient dbClient, UserSession userSession, DefaultOrganizationProvider defaultOrganizationProvider) { + public QualityGatesWsSupport(DbClient dbClient, UserSession userSession, DefaultOrganizationProvider defaultOrganizationProvider, ComponentFinder componentFinder) { this.dbClient = dbClient; this.userSession = userSession; this.defaultOrganizationProvider = defaultOrganizationProvider; + this.componentFinder = componentFinder; } public QGateWithOrgDto getByOrganizationAndId(DbSession dbSession, OrganizationDto organization, long qualityGateId) { @@ -111,15 +116,40 @@ public class QualityGatesWsSupport { userSession.checkPermission(ADMINISTER_QUALITY_GATES, qualityGate.getOrganizationUuid()); } - void checkCanAdminProject(OrganizationDto organization, ComponentDto project) { + void checkCanAdminProject(OrganizationDto organization, ProjectDto project) { if (userSession.hasPermission(ADMINISTER_QUALITY_GATES, organization) - || userSession.hasComponentPermission(ADMIN, project)) { + || userSession.hasProjectPermission(ADMIN, project)) { return; } throw insufficientPrivilegesException(); } - void checkProjectBelongsToOrganization(OrganizationDto organization, ComponentDto project) { + ProjectDto getProject(DbSession dbSession, OrganizationDto organization, @Nullable String projectKey, @Nullable String projectId) { + ProjectDto project; + if (projectId != null) { + project = getProjectById(dbSession, projectId); + } else if (projectKey != null) { + project = componentFinder.getProjectByKey(dbSession, projectKey); + } else { + throw new IllegalArgumentException(String.format("Must specify %s or %s", PARAM_PROJECT_KEY, PARAM_PROJECT_ID)); + } + + checkProjectBelongsToOrganization(organization, project); + return project; + } + + ProjectDto getProjectById(DbSession dbSession, String projectId) { + try { + long dbId = Long.parseLong(projectId); + return dbClient.componentDao().selectById(dbSession, dbId) + .flatMap(c -> dbClient.projectDao().selectByUuid(dbSession, c.uuid())) + .orElseThrow(() -> new NotFoundException(String.format("Project '%s' not found", projectId))); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid id: " + projectId); + } + } + + void checkProjectBelongsToOrganization(OrganizationDto organization, ProjectDto project) { if (project.getOrganizationUuid().equals(organization.getUuid())) { return; } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/SelectAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/SelectAction.java index 8107f245a43..b1ed5c3b8a2 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/SelectAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/SelectAction.java @@ -19,20 +19,16 @@ */ package org.sonar.server.qualitygate.ws; -import java.util.Optional; -import javax.annotation.Nullable; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateDto; -import org.sonar.server.component.ComponentFinder; -import org.sonar.server.component.ComponentFinder.ParamNames; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.ACTION_SELECT; import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_GATE_ID; @@ -42,12 +38,10 @@ import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; public class SelectAction implements QualityGatesWsAction { private final DbClient dbClient; - private final ComponentFinder componentFinder; private final QualityGatesWsSupport wsSupport; - public SelectAction(DbClient dbClient, ComponentFinder componentFinder, QualityGatesWsSupport wsSupport) { + public SelectAction(DbClient dbClient, QualityGatesWsSupport wsSupport) { this.dbClient = dbClient; - this.componentFinder = componentFinder; this.wsSupport = wsSupport; } @@ -88,48 +82,27 @@ public class SelectAction implements QualityGatesWsAction { @Override public void handle(Request request, Response response) { long gateId = request.mandatoryParamAsLong(PARAM_GATE_ID); - String projectId = request.param(PARAM_PROJECT_ID); String projectKey = request.param(PARAM_PROJECT_KEY); + String projectId = request.param(PARAM_PROJECT_ID); try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganization(dbSession, request); QGateWithOrgDto qualityGate = wsSupport.getByOrganizationAndId(dbSession, organization, gateId); - ComponentDto project = getProject(dbSession, organization, projectId, projectKey); + ProjectDto project = wsSupport.getProject(dbSession, organization, projectKey, projectId); wsSupport.checkCanAdminProject(organization, project); - QualityGateDto currentQualityGate = dbClient.qualityGateDao().selectByProjectUuid(dbSession, project.uuid()); + QualityGateDto currentQualityGate = dbClient.qualityGateDao().selectByProjectUuid(dbSession, project.getUuid()); if (currentQualityGate == null) { // project uses the default profile dbClient.projectQgateAssociationDao() - .insertProjectQGateAssociation(dbSession, project.uuid(), qualityGate.getUuid()); + .insertProjectQGateAssociation(dbSession, project.getUuid(), qualityGate.getUuid()); dbSession.commit(); } else if (!qualityGate.getUuid().equals(currentQualityGate.getUuid())) { dbClient.projectQgateAssociationDao() - .updateProjectQGateAssociation(dbSession, project.uuid(), qualityGate.getUuid()); + .updateProjectQGateAssociation(dbSession, project.getUuid(), qualityGate.getUuid()); dbSession.commit(); } } response.noContent(); } - - private ComponentDto getProject(DbSession dbSession, OrganizationDto organization, @Nullable String projectId, @Nullable String projectKey) { - ComponentDto project = selectProjectById(dbSession, projectId) - .orElseGet(() -> componentFinder.getByUuidOrKey(dbSession, projectId, projectKey, ParamNames.PROJECT_ID_AND_KEY)); - wsSupport.checkProjectBelongsToOrganization(organization, project); - return project; - } - - private Optional<ComponentDto> selectProjectById(DbSession dbSession, @Nullable String projectId) { - if (projectId == null) { - return Optional.empty(); - } - - try { - long dbId = Long.parseLong(projectId); - return dbClient.componentDao().selectById(dbSession, dbId); - } catch (NumberFormatException e) { - return Optional.empty(); - } - } - } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/AddProjectAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/AddProjectAction.java index c95b35324e3..d102b399db0 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/AddProjectAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/AddProjectAction.java @@ -27,8 +27,8 @@ import org.sonar.api.server.ws.WebService.NewAction; import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; @@ -83,7 +83,7 @@ public class AddProjectAction implements QProfileWsAction { userSession.checkLoggedIn(); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = loadProject(dbSession, request); + ProjectDto project = loadProject(dbSession, request); QProfileDto profile = wsSupport.getProfile(dbSession, QProfileReference.fromName(request)); OrganizationDto organization = wsSupport.getOrganization(dbSession, profile); checkPermissions(dbSession, organization, profile, project); @@ -106,14 +106,14 @@ public class AddProjectAction implements QProfileWsAction { response.noContent(); } - private ComponentDto loadProject(DbSession dbSession, Request request) { + private ProjectDto loadProject(DbSession dbSession, Request request) { String projectKey = request.mandatoryParam(PARAM_PROJECT); - return componentFinder.getByKey(dbSession, projectKey); + return componentFinder.getProjectByKey(dbSession, projectKey); } - private void checkPermissions(DbSession dbSession, OrganizationDto organization, QProfileDto profile, ComponentDto project) { + private void checkPermissions(DbSession dbSession, OrganizationDto organization, QProfileDto profile, ProjectDto project) { if (wsSupport.canEdit(dbSession, organization, profile) - || userSession.hasComponentPermission(UserRole.ADMIN, project)) { + || userSession.hasProjectPermission(UserRole.ADMIN, project)) { return; } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/RemoveProjectAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/RemoveProjectAction.java index 10a8c7a8939..2d20549b46f 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/RemoveProjectAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/RemoveProjectAction.java @@ -27,8 +27,8 @@ import org.sonar.api.server.ws.WebService.NewAction; import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; @@ -81,7 +81,7 @@ public class RemoveProjectAction implements QProfileWsAction { userSession.checkLoggedIn(); try (DbSession dbSession = dbClient.openSession(false)) { - ComponentDto project = loadProject(dbSession, request); + ProjectDto project = loadProject(dbSession, request); QProfileDto profile = wsSupport.getProfile(dbSession, QProfileReference.fromName(request)); OrganizationDto organization = wsSupport.getOrganization(dbSession, profile); checkPermissions(dbSession, organization, profile, project); @@ -96,13 +96,13 @@ public class RemoveProjectAction implements QProfileWsAction { } } - private ComponentDto loadProject(DbSession dbSession, Request request) { + private ProjectDto loadProject(DbSession dbSession, Request request) { String projectKey = request.mandatoryParam(PARAM_PROJECT); - return componentFinder.getByKey(dbSession, projectKey); + return componentFinder.getProjectByKey(dbSession, projectKey); } - private void checkPermissions(DbSession dbSession, OrganizationDto organization, QProfileDto profile, ComponentDto project) { - if (wsSupport.canEdit(dbSession, organization, profile) || userSession.hasComponentPermission(UserRole.ADMIN, project)) { + private void checkPermissions(DbSession dbSession, OrganizationDto organization, QProfileDto profile, ProjectDto project) { + if (wsSupport.canEdit(dbSession, organization, profile) || userSession.hasProjectPermission(UserRole.ADMIN, project)) { return; } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/SearchAction.java index ebd884ecc05..f5f8c87c613 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/SearchAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/SearchAction.java @@ -41,8 +41,8 @@ import org.sonar.api.server.ws.WebService.NewAction; import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualityprofile.ActiveRuleCountQuery; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.user.UserDto; @@ -153,7 +153,7 @@ public class SearchAction implements QProfileWsAction { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganizationByKey(dbSession, request.getOrganizationKey()); - ComponentDto project = findProject(dbSession, organization, request); + ProjectDto project = findProject(dbSession, organization, request); List<QProfileDto> defaultProfiles = dbClient.qualityProfileDao().selectDefaultProfiles(dbSession, organization, getLanguageKeys()); List<String> editableProfiles = searchEditableProfiles(dbSession, organization); @@ -174,21 +174,17 @@ public class SearchAction implements QProfileWsAction { } @CheckForNull - private ComponentDto findProject(DbSession dbSession, OrganizationDto organization, SearchRequest request) { + private ProjectDto findProject(DbSession dbSession, OrganizationDto organization, SearchRequest request) { if (request.getProjectKey() == null) { return null; } - ComponentDto project = componentFinder.getByKey(dbSession, request.getProjectKey()); + ProjectDto project = componentFinder.getProjectByKey(dbSession, request.getProjectKey()); if (!project.getOrganizationUuid().equals(organization.getUuid())) { - throw new NotFoundException(format("Component key '%s' not found", project.getDbKey())); + throw new NotFoundException(format("Project '%s' not found", project.getKey())); } - if (project.isRoot()) { - return project; - } - ComponentDto component = dbClient.componentDao().selectByUuid(dbSession, project.projectUuid()).orElse(null); - checkState(component != null, "Project uuid of component uuid '%s' does not exist", project.uuid()); - return component; + + return project; } private List<String> searchEditableProfiles(DbSession dbSession, OrganizationDto organization) { @@ -207,7 +203,7 @@ public class SearchAction implements QProfileWsAction { } private List<QProfileDto> searchProfiles(DbSession dbSession, SearchRequest request, OrganizationDto organization, List<QProfileDto> defaultProfiles, - @Nullable ComponentDto project) { + @Nullable ProjectDto project) { Collection<QProfileDto> profiles = selectAllProfiles(dbSession, organization); return profiles.stream() @@ -237,7 +233,7 @@ public class SearchAction implements QProfileWsAction { return p -> !request.getDefaults() || defaultProfileUuids.contains(p.getKee()); } - private Predicate<QProfileDto> byProject(DbSession dbSession, @Nullable ComponentDto project, List<QProfileDto> defaultProfiles) { + private Predicate<QProfileDto> byProject(DbSession dbSession, @Nullable ProjectDto project, List<QProfileDto> defaultProfiles) { if (project == null) { return p -> true; } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ui/ws/ComponentAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ui/ws/ComponentAction.java index 5be2612f42b..933847203ef 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ui/ws/ComponentAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ui/ws/ComponentAction.java @@ -265,7 +265,7 @@ public class ComponentAction implements NavigationWsAction { } private void writeQualityGate(JsonWriter json, DbSession session, OrganizationDto organization, ComponentDto component) { - QualityGateFinder.QualityGateData qualityGateData = qualityGateFinder.getQualityGate(session, organization, component) + QualityGateFinder.QualityGateData qualityGateData = qualityGateFinder.getQualityGate(session, organization, component.uuid()) .orElseThrow(() -> new NotFoundException(format("Quality Gate not found for %s", component.getKey()))); QualityGateDto qualityGateDto = qualityGateData.getQualityGate(); json.name("qualityGate").beginObject() diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/CurrentAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/CurrentAction.java index 25f7cc7eb7a..d6440b5e8f7 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/CurrentAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/CurrentAction.java @@ -30,9 +30,11 @@ import org.sonar.core.platform.PluginRepository; import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.db.component.BranchDto; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.db.user.UserDto; import org.sonar.server.issue.AvatarResolver; import org.sonar.server.organization.DefaultOrganizationProvider; @@ -50,12 +52,12 @@ import static java.util.stream.Collectors.toList; import static org.apache.commons.lang.StringUtils.EMPTY; import static org.sonar.api.web.UserRole.USER; import static org.sonar.server.ws.WsUtils.writeProtobuf; -import static org.sonarqube.ws.Users.CurrentWsResponse.Permissions; -import static org.sonarqube.ws.Users.CurrentWsResponse.newBuilder; import static org.sonarqube.ws.Users.CurrentWsResponse.HomepageType.APPLICATION; import static org.sonarqube.ws.Users.CurrentWsResponse.HomepageType.ORGANIZATION; import static org.sonarqube.ws.Users.CurrentWsResponse.HomepageType.PORTFOLIO; import static org.sonarqube.ws.Users.CurrentWsResponse.HomepageType.PROJECT; +import static org.sonarqube.ws.Users.CurrentWsResponse.Permissions; +import static org.sonarqube.ws.Users.CurrentWsResponse.newBuilder; import static org.sonarqube.ws.client.user.UsersWsParameters.ACTION_CURRENT; public class CurrentAction implements UsersWsAction { @@ -102,9 +104,9 @@ public class CurrentAction implements UsersWsAction { } } else { writeProtobuf(newBuilder() - .setIsLoggedIn(false) - .setPermissions(Permissions.newBuilder().addAllGlobal(getGlobalPermissions()).build()) - .build(), + .setIsLoggedIn(false) + .setPermissions(Permissions.newBuilder().addAllGlobal(getGlobalPermissions()).build()) + .build(), request, response); } } @@ -168,8 +170,9 @@ public class CurrentAction implements UsersWsAction { } private Optional<CurrentWsResponse.Homepage> projectHomepage(DbSession dbSession, UserDto user) { - Optional<ComponentDto> projectOptional = dbClient.componentDao().selectByUuid(dbSession, of(user.getHomepageParameter()).orElse(EMPTY)); - if (shouldCleanProjectHomepage(projectOptional)) { + Optional<BranchDto> branchOptional = ofNullable(user.getHomepageParameter()).flatMap(p -> dbClient.branchDao().selectByUuid(dbSession, p)); + Optional<ProjectDto> projectOptional = branchOptional.flatMap(b -> dbClient.projectDao().selectByUuid(dbSession, b.getProjectUuid())); + if (shouldCleanProjectHomepage(projectOptional, branchOptional)) { cleanUserHomepageInDb(dbSession, user); return empty(); } @@ -177,12 +180,15 @@ public class CurrentAction implements UsersWsAction { CurrentWsResponse.Homepage.Builder homepage = CurrentWsResponse.Homepage.newBuilder() .setType(CurrentWsResponse.HomepageType.valueOf(user.getHomepageType())) .setComponent(projectOptional.get().getKey()); - ofNullable(projectOptional.get().getBranch()).ifPresent(homepage::setBranch); + + if (!branchOptional.get().getProjectUuid().equals(branchOptional.get().getUuid())) { + homepage.setBranch(branchOptional.get().getKey()); + } return of(homepage.build()); } - private boolean shouldCleanProjectHomepage(Optional<ComponentDto> projectOptional) { - return !projectOptional.isPresent() || !userSession.hasComponentPermission(USER, projectOptional.get()); + private boolean shouldCleanProjectHomepage(Optional<ProjectDto> projectOptional, Optional<BranchDto> branchOptional) { + return !projectOptional.isPresent() || !branchOptional.isPresent() || !userSession.hasProjectPermission(USER, projectOptional.get()); } private Optional<CurrentWsResponse.Homepage> applicationAndPortfolioHomepage(DbSession dbSession, UserDto user) { diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/SetHomepageAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/SetHomepageAction.java index 559960a676f..eaa1c2fa1a3 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/SetHomepageAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/SetHomepageAction.java @@ -27,6 +27,7 @@ import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.db.project.ProjectDto; import org.sonar.db.user.UserDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.NotFoundException; @@ -122,7 +123,12 @@ public class SetHomepageAction implements UsersWsAction { switch (type) { case PROJECT: checkArgument(isNotBlank(componentParameter), PARAMETER_REQUIRED, type.name(), PARAM_COMPONENT); - return componentFinder.getByKeyAndOptionalBranchOrPullRequest(dbSession, componentParameter, branchParameter, null).uuid(); + ProjectDto projectDto = componentFinder.getProjectByKey(dbSession, componentParameter); + if (branchParameter != null) { + return componentFinder.getBranchOrPullRequest(dbSession, projectDto, branchParameter, null).getUuid(); + } else { + return projectDto.getUuid(); + } case PORTFOLIO: case APPLICATION: checkArgument(isNotBlank(componentParameter), PARAMETER_REQUIRED, type.name(), PARAM_COMPONENT); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/CreateAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/CreateAction.java index 33f0ad6e990..47dd8c0caa5 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/CreateAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/CreateAction.java @@ -27,9 +27,10 @@ import org.sonar.api.server.ws.WebService; import org.sonar.core.util.UuidFactory; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDto; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.organization.DefaultOrganizationProvider; import org.sonar.server.user.UserSession; @@ -66,14 +67,16 @@ public class CreateAction implements WebhooksWsAction { private final DefaultOrganizationProvider defaultOrganizationProvider; private final UuidFactory uuidFactory; private final WebhookSupport webhookSupport; + private final ComponentFinder componentFinder; public CreateAction(DbClient dbClient, UserSession userSession, DefaultOrganizationProvider defaultOrganizationProvider, - UuidFactory uuidFactory, WebhookSupport webhookSupport) { + UuidFactory uuidFactory, WebhookSupport webhookSupport, ComponentFinder componentFinder) { this.dbClient = dbClient; this.userSession = userSession; this.defaultOrganizationProvider = defaultOrganizationProvider; this.uuidFactory = uuidFactory; this.webhookSupport = webhookSupport; + this.componentFinder = componentFinder; } @Override @@ -141,13 +144,11 @@ public class CreateAction implements WebhooksWsAction { organizationDto = defaultOrganizationDto(dbSession); } - ComponentDto projectDto = null; + ProjectDto projectDto = null; if (isNotBlank(projectKey)) { - Optional<ComponentDto> dtoOptional = dbClient.componentDao().selectByKey(dbSession, projectKey); - ComponentDto componentDto = checkFoundWithOptional(dtoOptional, "No project with key '%s'", projectKey); - webhookSupport.checkThatProjectBelongsToOrganization(componentDto, organizationDto, "Project '%s' does not belong to organisation '%s'", projectKey, organizationKey); - webhookSupport.checkPermission(componentDto); - projectDto = componentDto; + projectDto = componentFinder.getProjectByKey(dbSession, projectKey); + webhookSupport.checkThatProjectBelongsToOrganization(projectDto, organizationDto, "Project '%s' does not belong to organisation '%s'", projectKey, organizationKey); + webhookSupport.checkPermission(projectDto); } else { webhookSupport.checkPermission(organizationDto); } @@ -164,8 +165,7 @@ public class CreateAction implements WebhooksWsAction { } - private WebhookDto doHandle(DbSession dbSession, @Nullable OrganizationDto organization, - @Nullable ComponentDto project, String name, String url, @Nullable String secret) { + private WebhookDto doHandle(DbSession dbSession, @Nullable OrganizationDto organization, @Nullable ProjectDto project, String name, String url, @Nullable String secret) { checkState(organization != null || project != null, "A webhook can not be created if not linked to an organization or a project."); @@ -178,7 +178,7 @@ public class CreateAction implements WebhooksWsAction { if (project != null) { checkNumberOfWebhook(numberOfWebhookOf(dbSession, project), "Maximum number of webhook reached for project '%s'", project.getKey()); - dto.setProjectUuid(project.projectUuid()); + dto.setProjectUuid(project.getUuid()); } else { checkNumberOfWebhook(numberOfWebhookOf(dbSession, organization), "Maximum number of webhook reached for organization '%s'", organization.getKey()); dto.setOrganizationUuid(organization.getUuid()); @@ -209,8 +209,8 @@ public class CreateAction implements WebhooksWsAction { return dbClient.webhookDao().selectByOrganization(dbSession, organizationDto).size(); } - private int numberOfWebhookOf(DbSession dbSession, ComponentDto componentDto) { - return dbClient.webhookDao().selectByProject(dbSession, componentDto).size(); + private int numberOfWebhookOf(DbSession dbSession, ProjectDto projectDto) { + return dbClient.webhookDao().selectByProject(dbSession, projectDto).size(); } private OrganizationDto defaultOrganizationDto(DbSession dbSession) { diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/DeleteAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/DeleteAction.java index b80fe60f6bd..752ea315a86 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/DeleteAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/DeleteAction.java @@ -25,16 +25,16 @@ import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDto; import org.sonar.server.user.UserSession; +import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; import static org.sonar.server.webhook.ws.WebhooksWsParameters.DELETE_ACTION; import static org.sonar.server.webhook.ws.WebhooksWsParameters.KEY_PARAM; import static org.sonar.server.webhook.ws.WebhooksWsParameters.KEY_PARAM_MAXIMUM_LENGTH; import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; -import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; import static org.sonar.server.ws.WsUtils.checkStateWithOptional; public class DeleteAction implements WebhooksWsAction { @@ -61,7 +61,7 @@ public class DeleteAction implements WebhooksWsAction { action.createParam(KEY_PARAM) .setRequired(true) .setMaximumLength(KEY_PARAM_MAXIMUM_LENGTH) - .setDescription("The key of the webhook to be deleted, "+ + .setDescription("The key of the webhook to be deleted, " + "auto-generated value can be obtained through api/webhooks/create or api/webhooks/list") .setExampleValue(KEY_PROJECT_EXAMPLE_001); } @@ -86,9 +86,9 @@ public class DeleteAction implements WebhooksWsAction { String projectUuid = webhookDto.getProjectUuid(); if (projectUuid != null) { - Optional<ComponentDto> optionalDto = dbClient.componentDao().selectByUuid(dbSession, projectUuid); - ComponentDto componentDto = checkStateWithOptional(optionalDto, "the requested project '%s' was not found", projectUuid); - webhookSupport.checkPermission(componentDto); + Optional<ProjectDto> optionalDto = dbClient.projectDao().selectByUuid(dbSession, projectUuid); + ProjectDto projectDto = checkStateWithOptional(optionalDto, "the requested project '%s' was not found", projectUuid); + webhookSupport.checkPermission(projectDto); deleteWebhook(dbSession, webhookDto); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/ListAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/ListAction.java index 31951d3ba9d..e3dd2786a9f 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/ListAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/ListAction.java @@ -29,10 +29,11 @@ import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDeliveryLiteDto; import org.sonar.db.webhook.WebhookDto; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.organization.DefaultOrganizationProvider; import org.sonar.server.user.UserSession; import org.sonarqube.ws.Webhooks; @@ -41,13 +42,13 @@ import org.sonarqube.ws.Webhooks.ListResponseElement; import static org.apache.commons.lang.StringUtils.isNotBlank; import static org.sonar.api.utils.DateUtils.formatDateTime; +import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; import static org.sonar.server.webhook.HttpUrlHelper.obfuscateCredentials; import static org.sonar.server.webhook.ws.WebhooksWsParameters.LIST_ACTION; import static org.sonar.server.webhook.ws.WebhooksWsParameters.ORGANIZATION_KEY_PARAM; import static org.sonar.server.webhook.ws.WebhooksWsParameters.PROJECT_KEY_PARAM; import static org.sonar.server.ws.KeyExamples.KEY_ORG_EXAMPLE_001; import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; -import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; import static org.sonar.server.ws.WsUtils.checkStateWithOptional; import static org.sonar.server.ws.WsUtils.writeProtobuf; @@ -57,12 +58,15 @@ public class ListAction implements WebhooksWsAction { private final UserSession userSession; private final DefaultOrganizationProvider defaultOrganizationProvider; private final WebhookSupport webhookSupport; + private final ComponentFinder componentFinder; - public ListAction(DbClient dbClient, UserSession userSession, DefaultOrganizationProvider defaultOrganizationProvider, WebhookSupport webhookSupport) { + public ListAction(DbClient dbClient, UserSession userSession, DefaultOrganizationProvider defaultOrganizationProvider, + WebhookSupport webhookSupport, ComponentFinder componentFinder) { this.dbClient = dbClient; this.userSession = userSession; this.defaultOrganizationProvider = defaultOrganizationProvider; this.webhookSupport = webhookSupport; + this.componentFinder = componentFinder; } @Override @@ -116,12 +120,11 @@ public class ListAction implements WebhooksWsAction { } if (isNotBlank(projectKey)) { - Optional<ComponentDto> optional = dbClient.componentDao().selectByKey(dbSession, projectKey); - ComponentDto componentDto = checkFoundWithOptional(optional, "project %s does not exist", projectKey); - webhookSupport.checkPermission(componentDto); - webhookSupport.checkThatProjectBelongsToOrganization(componentDto, organizationDto, "Project '%s' does not belong to organisation '%s'", projectKey, organizationKey); - webhookSupport.checkPermission(componentDto); - return dbClient.webhookDao().selectByProject(dbSession, componentDto); + ProjectDto projectDto = componentFinder.getProjectByKey(dbSession, projectKey); + webhookSupport.checkPermission(projectDto); + webhookSupport.checkThatProjectBelongsToOrganization(projectDto, organizationDto, "Project '%s' does not belong to organisation '%s'", projectKey, organizationKey); + webhookSupport.checkPermission(projectDto); + return dbClient.webhookDao().selectByProject(dbSession, projectDto); } else { webhookSupport.checkPermission(organizationDto); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/UpdateAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/UpdateAction.java index 22fd4237170..eb984f8dbff 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/UpdateAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/UpdateAction.java @@ -26,11 +26,13 @@ import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDto; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; +import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; import static org.sonar.server.webhook.ws.WebhooksWsParameters.KEY_PARAM; import static org.sonar.server.webhook.ws.WebhooksWsParameters.KEY_PARAM_MAXIMUM_LENGTH; import static org.sonar.server.webhook.ws.WebhooksWsParameters.NAME_PARAM; @@ -43,7 +45,6 @@ import static org.sonar.server.webhook.ws.WebhooksWsParameters.URL_PARAM_MAXIMUM import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001; import static org.sonar.server.ws.KeyExamples.NAME_WEBHOOK_EXAMPLE_001; import static org.sonar.server.ws.KeyExamples.URL_WEBHOOK_EXAMPLE_001; -import static org.sonar.server.exceptions.NotFoundException.checkFoundWithOptional; import static org.sonar.server.ws.WsUtils.checkStateWithOptional; public class UpdateAction implements WebhooksWsAction { @@ -51,11 +52,13 @@ public class UpdateAction implements WebhooksWsAction { private final DbClient dbClient; private final UserSession userSession; private final WebhookSupport webhookSupport; + private final ComponentFinder componentFinder; - public UpdateAction(DbClient dbClient, UserSession userSession, WebhookSupport webhookSupport) { + public UpdateAction(DbClient dbClient, UserSession userSession, WebhookSupport webhookSupport, ComponentFinder componentFinder) { this.dbClient = dbClient; this.userSession = userSession; this.webhookSupport = webhookSupport; + this.componentFinder = componentFinder; } @Override @@ -121,9 +124,8 @@ public class UpdateAction implements WebhooksWsAction { String projectUuid = webhookDto.getProjectUuid(); if (projectUuid != null) { - Optional<ComponentDto> optionalDto = dbClient.componentDao().selectByUuid(dbSession, projectUuid); - ComponentDto componentDto = checkStateWithOptional(optionalDto, "the requested project '%s' was not found", projectUuid); - webhookSupport.checkPermission(componentDto); + ProjectDto projectDto = componentFinder.getProjectByUuid(dbSession, projectUuid); + webhookSupport.checkPermission(projectDto); updateWebhook(dbSession, webhookDto, name, url, secret); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java index ece228c655e..7567211391c 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java @@ -29,7 +29,7 @@ import org.sonar.api.web.UserRole; import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDeliveryLiteDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; @@ -96,74 +96,74 @@ public class WebhookDeliveriesAction implements WebhooksWsAction { userSession.checkLoggedIn(); String ceTaskId = request.param(PARAM_TASK); - String componentKey = request.param(PARAM_COMPONENT); + String projectKey = request.param(PARAM_COMPONENT); String webhookUuid = request.param(PARAM_WEBHOOK); int page = request.mandatoryParamAsInt(PAGE); int pageSize = request.mandatoryParamAsInt(PAGE_SIZE); - checkArgument(webhookUuid != null ^ (ceTaskId != null ^ componentKey != null), + checkArgument(webhookUuid != null ^ (ceTaskId != null ^ projectKey != null), "Either '%s' or '%s' or '%s' must be provided", PARAM_TASK, PARAM_COMPONENT, PARAM_WEBHOOK); - Data data = loadFromDatabase(webhookUuid, ceTaskId, componentKey, page, pageSize); + Data data = loadFromDatabase(webhookUuid, ceTaskId, projectKey, page, pageSize); data.ensureAdminPermission(userSession); data.writeTo(request, response); } - private Data loadFromDatabase(@Nullable String webhookUuid, @Nullable String ceTaskId, @Nullable String componentKey, int page, int pageSize) { - ComponentDto component; + private Data loadFromDatabase(@Nullable String webhookUuid, @Nullable String ceTaskId, @Nullable String projectKey, int page, int pageSize) { + ProjectDto project; List<WebhookDeliveryLiteDto> deliveries; int totalElements; try (DbSession dbSession = dbClient.openSession(false)) { if (isNotBlank(webhookUuid)) { totalElements = dbClient.webhookDeliveryDao().countDeliveriesByWebhookUuid(dbSession, webhookUuid); deliveries = dbClient.webhookDeliveryDao().selectByWebhookUuid(dbSession, webhookUuid, offset(page, pageSize), pageSize); - component = getComponentDto(dbSession, deliveries); - } else if (componentKey != null) { - component = componentFinder.getByKey(dbSession, componentKey); - totalElements = dbClient.webhookDeliveryDao().countDeliveriesByComponentUuid(dbSession, component.uuid()); - deliveries = dbClient.webhookDeliveryDao().selectOrderedByComponentUuid(dbSession, component.uuid(), offset(page, pageSize), pageSize); + project = getProjectDto(dbSession, deliveries); + } else if (projectKey != null) { + project = componentFinder.getProjectByKey(dbSession, projectKey); + totalElements = dbClient.webhookDeliveryDao().countDeliveriesByComponentUuid(dbSession, project.getUuid()); + deliveries = dbClient.webhookDeliveryDao().selectOrderedByComponentUuid(dbSession, project.getUuid(), offset(page, pageSize), pageSize); } else { totalElements = dbClient.webhookDeliveryDao().countDeliveriesByCeTaskUuid(dbSession, ceTaskId); deliveries = dbClient.webhookDeliveryDao().selectOrderedByCeTaskUuid(dbSession, ceTaskId, offset(page, pageSize), pageSize); - component = getComponentDto(dbSession, deliveries); + project = getProjectDto(dbSession, deliveries); } } - return new Data(component, deliveries).withPagingInfo(page, pageSize, totalElements); + return new Data(project, deliveries).withPagingInfo(page, pageSize, totalElements); } - private ComponentDto getComponentDto(DbSession dbSession, List<WebhookDeliveryLiteDto> deliveries) { + private ProjectDto getProjectDto(DbSession dbSession, List<WebhookDeliveryLiteDto> deliveries) { Optional<String> deliveredComponentUuid = deliveries .stream() .map(WebhookDeliveryLiteDto::getComponentUuid) .findFirst(); if (deliveredComponentUuid.isPresent()) { - return componentFinder.getByUuid(dbSession, deliveredComponentUuid.get()); + return componentFinder.getProjectByUuid(dbSession, deliveredComponentUuid.get()); } else { return null; } } private static class Data { - private final ComponentDto component; + private final ProjectDto project; private final List<WebhookDeliveryLiteDto> deliveryDtos; private int pageIndex; private int pageSize; private int totalElements; - Data(@Nullable ComponentDto component, List<WebhookDeliveryLiteDto> deliveries) { + Data(@Nullable ProjectDto project, List<WebhookDeliveryLiteDto> deliveries) { this.deliveryDtos = deliveries; if (deliveries.isEmpty()) { - this.component = null; + this.project = null; } else { - this.component = requireNonNull(component); + this.project = requireNonNull(project); } } void ensureAdminPermission(UserSession userSession) { - if (component != null) { - userSession.checkComponentPermission(UserRole.ADMIN, component); + if (project != null) { + userSession.checkProjectPermission(UserRole.ADMIN, project); } } @@ -171,7 +171,7 @@ public class WebhookDeliveriesAction implements WebhooksWsAction { Webhooks.DeliveriesWsResponse.Builder responseBuilder = Webhooks.DeliveriesWsResponse.newBuilder(); Webhooks.Delivery.Builder deliveryBuilder = Webhooks.Delivery.newBuilder(); for (WebhookDeliveryLiteDto dto : deliveryDtos) { - copyDtoToProtobuf(component, dto, deliveryBuilder); + copyDtoToProtobuf(project, dto, deliveryBuilder); responseBuilder.addDeliveries(deliveryBuilder); } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveryAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveryAction.java index 0cd5bb98180..20f50ba0043 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveryAction.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveryAction.java @@ -27,7 +27,7 @@ import org.sonar.api.web.UserRole; import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDeliveryDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.user.UserSession; @@ -82,28 +82,28 @@ public class WebhookDeliveryAction implements WebhooksWsAction { try (DbSession dbSession = dbClient.openSession(false)) { Optional<WebhookDeliveryDto> delivery = dbClient.webhookDeliveryDao().selectByUuid(dbSession, deliveryUuid); checkFoundWithOptional(delivery, "Webhook delivery not found"); - ComponentDto component = componentFinder.getByUuid(dbSession, delivery.get().getComponentUuid()); - return new Data(component, delivery.get()); + ProjectDto project = componentFinder.getProjectByUuid(dbSession, delivery.get().getComponentUuid()); + return new Data(project, delivery.get()); } } private static class Data { - private final ComponentDto component; + private final ProjectDto project; private final WebhookDeliveryDto deliveryDto; - Data(ComponentDto component, WebhookDeliveryDto delivery) { + Data(ProjectDto component, WebhookDeliveryDto delivery) { this.deliveryDto = requireNonNull(delivery); - this.component = requireNonNull(component); + this.project = requireNonNull(component); } void ensureAdminPermission(UserSession userSession) { - userSession.checkComponentPermission(UserRole.ADMIN, component); + userSession.checkProjectPermission(UserRole.ADMIN, project); } void writeTo(Request request, Response response) { Webhooks.DeliveryWsResponse.Builder responseBuilder = Webhooks.DeliveryWsResponse.newBuilder(); Webhooks.Delivery.Builder deliveryBuilder = Webhooks.Delivery.newBuilder(); - copyDtoToProtobuf(component, deliveryDto, deliveryBuilder); + copyDtoToProtobuf(project, deliveryDto, deliveryBuilder); responseBuilder.setDelivery(deliveryBuilder); writeProtobuf(responseBuilder.build(), request, response); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookSupport.java index e6e59cb9df0..a18987be054 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookSupport.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookSupport.java @@ -19,8 +19,8 @@ */ package org.sonar.server.webhook.ws; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.user.UserSession; @@ -36,8 +36,8 @@ public class WebhookSupport { this.userSession = userSession; } - void checkPermission(ComponentDto componentDto) { - userSession.checkComponentPermission(ADMIN, componentDto); + void checkPermission(ProjectDto projectDto) { + userSession.checkProjectPermission(ADMIN, projectDto); } void checkPermission(OrganizationDto organizationDto) { @@ -50,8 +50,8 @@ public class WebhookSupport { } } - void checkThatProjectBelongsToOrganization(ComponentDto componentDto, OrganizationDto organizationDto, String message, Object... messageArguments) { - if (!organizationDto.getUuid().equals(componentDto.getOrganizationUuid())) { + void checkThatProjectBelongsToOrganization(ProjectDto projectDto, OrganizationDto organizationDto, String message, Object... messageArguments) { + if (!organizationDto.getUuid().equals(projectDto.getOrganizationUuid())) { throw new NotFoundException(format(message, messageArguments)); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookWsSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookWsSupport.java index f70a16b385c..b22d27a62f6 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookWsSupport.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookWsSupport.java @@ -19,7 +19,7 @@ */ package org.sonar.server.webhook.ws; -import org.sonar.db.component.ComponentDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDeliveryDto; import org.sonar.db.webhook.WebhookDeliveryLiteDto; import org.sonarqube.ws.Webhooks; @@ -32,7 +32,7 @@ class WebhookWsSupport { // only statics } - static Webhooks.Delivery.Builder copyDtoToProtobuf(ComponentDto component, WebhookDeliveryLiteDto dto, Webhooks.Delivery.Builder builder) { + static Webhooks.Delivery.Builder copyDtoToProtobuf(ProjectDto project, WebhookDeliveryLiteDto dto, Webhooks.Delivery.Builder builder) { builder .clear() .setId(dto.getUuid()) @@ -40,15 +40,15 @@ class WebhookWsSupport { .setName(dto.getName()) .setUrl(dto.getUrl()) .setSuccess(dto.isSuccess()) - .setComponentKey(component.getDbKey()); + .setComponentKey(project.getKey()); ofNullable(dto.getCeTaskUuid()).ifPresent(builder::setCeTaskId); ofNullable(dto.getHttpStatus()).ifPresent(builder::setHttpStatus); ofNullable(dto.getDurationMs()).ifPresent(builder::setDurationMs); return builder; } - static Webhooks.Delivery.Builder copyDtoToProtobuf(ComponentDto component, WebhookDeliveryDto dto, Webhooks.Delivery.Builder builder) { - copyDtoToProtobuf(component, (WebhookDeliveryLiteDto) dto, builder); + static Webhooks.Delivery.Builder copyDtoToProtobuf(ProjectDto project, WebhookDeliveryDto dto, Webhooks.Delivery.Builder builder) { + copyDtoToProtobuf(project, (WebhookDeliveryLiteDto) dto, builder); builder.setPayload(dto.getPayload()); ofNullable(dto.getErrorStacktrace()).ifPresent(builder::setErrorStacktrace); return builder; diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/MeasureActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/MeasureActionTest.java index 9b2e29fc0d0..d10f564f694 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/MeasureActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/MeasureActionTest.java @@ -216,7 +216,7 @@ public class MeasureActionTest { @Test public void measure_on_non_main_branch() { - ComponentDto project = db.components().insertMainBranch(p -> p.setPrivate(false)); + ComponentDto project = db.components().insertPublicProject(p -> p.setPrivate(false)); userSession.registerComponents(project); MetricDto metric = db.measures().insertMetric(m -> m.setKey(BUGS_KEY).setValueType(INT.name())); db.measures().insertLiveMeasure(project, metric, m -> m.setValue(5_000d)); @@ -276,13 +276,13 @@ public class MeasureActionTest { @Test public void return_error_if_branch_does_not_exist() throws ParseException { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)); - userSession.addProjectPermission(USER, project); + userSession.registerComponents(project); MetricDto metric = db.measures().insertMetric(m -> m.setKey(BUGS_KEY)); TestResponse response = ws.newRequest() - .setParam("project", branch.getKey()) + .setParam("project", project.getKey()) .setParam("branch", "unknown") .setParam("metric", metric.getKey()) .execute(); @@ -316,7 +316,7 @@ public class MeasureActionTest { .setParam("metric", metric.getKey()) .execute(); - checkError(response, "Project is invalid"); + checkError(response, "Project has not been found"); } @Test diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/QualityGateActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/QualityGateActionTest.java index 8f4788d72c1..b70c9b67745 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/QualityGateActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/badge/ws/QualityGateActionTest.java @@ -146,7 +146,7 @@ public class QualityGateActionTest { @Test public void quality_gate_on_branch() { - ComponentDto project = db.components().insertMainBranch(p -> p.setPrivate(false)); + ComponentDto project = db.components().insertPublicProject(p -> p.setPrivate(false)); userSession.registerComponents(project); MetricDto metric = createQualityGateMetric(); db.measures().insertLiveMeasure(project, metric, m -> m.setData(OK.name())); @@ -186,7 +186,7 @@ public class QualityGateActionTest { .setParam("project", directory.getKey()) .execute(); - checkError(response, "Project is invalid"); + checkError(response, "Project has not been found"); } @Test @@ -225,12 +225,12 @@ public class QualityGateActionTest { @Test public void return_error_on_not_existing_branch() throws ParseException { - ComponentDto project = db.components().insertMainBranch(p -> p.setPrivate(false)); + ComponentDto project = db.components().insertPublicProject(p -> p.setPrivate(false)); userSession.registerComponents(project); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BRANCH)); TestResponse response = ws.newRequest() - .setParam("project", branch.getKey()) + .setParam("project", project.getKey()) .setParam("branch", "unknown") .execute(); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/batch/ProjectDataLoaderTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/batch/ProjectDataLoaderTest.java index 84268d2132f..e3437f4bb48 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/batch/ProjectDataLoaderTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/batch/ProjectDataLoaderTest.java @@ -66,7 +66,7 @@ public class ProjectDataLoaderTest { private int uuidCounter = 0; private ResourceTypesRule resourceTypes = new ResourceTypesRule().setRootQualifiers(Qualifiers.PROJECT); private MapSettings settings = new MapSettings(); - private ProjectDataLoader underTest = new ProjectDataLoader(dbClient, userSession, new ComponentFinder(dbClient, resourceTypes), settings.asConfig()); + private ProjectDataLoader underTest = new ProjectDataLoader(dbClient, userSession, new ComponentFinder(dbClient, resourceTypes)); @Test public void throws_NotFoundException_when_branch_does_not_exist() { @@ -218,22 +218,6 @@ public class ProjectDataLoaderTest { underTest.load(ProjectDataQuery.create().setProjectKey(project.getKey())); } - @Test - public void throw_ForbiddenException_if_no_scan_permission_on_sonarcloud() { - // Test the SonarCloud specific message - settings.setProperty(SONARCLOUD_ENABLED.getKey(), "true"); - underTest = new ProjectDataLoader(dbClient, userSession, new ComponentFinder(dbClient, resourceTypes), settings.asConfig()); - - ComponentDto project = db.components().insertPrivateProject(); - // Browse is not enough - userSession.logIn().addProjectPermission(UserRole.USER, project); - - expectedException.expect(ForbiddenException.class); - expectedException.expectMessage("You're not authorized to push analysis results to SonarCloud. Please contact your SonarCloud organization administrator."); - - underTest.load(ProjectDataQuery.create().setProjectKey(project.getKey())); - } - private static FileSourceDto newFileSourceDto(ComponentDto file) { return new FileSourceDto() .setFileUuid(file.uuid()) diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/pr/ws/DeleteActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/pr/ws/DeleteActionTest.java index 1592a33aa77..d28701b407a 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/pr/ws/DeleteActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/pr/ws/DeleteActionTest.java @@ -28,6 +28,7 @@ import org.sonar.api.utils.System2; import org.sonar.api.web.UserRole; 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.server.component.ComponentCleanerService; import org.sonar.server.component.ComponentFinder; @@ -71,7 +72,7 @@ public class DeleteActionTest { @Test public void delete_pull_request() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("1984").setBranchType(PULL_REQUEST)); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); @@ -80,7 +81,7 @@ public class DeleteActionTest { .setParam("project", project.getKey()) .setParam("pullRequest", "1984") .execute(); - verifyDeletedKey(branch.getDbKey()); + verifyDeletedKey("1984"); } @Test @@ -130,7 +131,7 @@ public class DeleteActionTest { userSession.logIn(); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Project key 'foo' not found"); + expectedException.expectMessage("Project 'foo' not found"); ws.newRequest() .setParam("project", "foo") @@ -139,9 +140,9 @@ public class DeleteActionTest { } private void verifyDeletedKey(String key) { - ArgumentCaptor<ComponentDto> argument = ArgumentCaptor.forClass(ComponentDto.class); + ArgumentCaptor<BranchDto> argument = ArgumentCaptor.forClass(BranchDto.class); verify(componentCleanerService).deleteBranch(any(DbSession.class), argument.capture()); - assertThat(argument.getValue().getDbKey()).isEqualTo(key); + assertThat(argument.getValue().getKey()).isEqualTo(key); } } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/pr/ws/ListActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/pr/ws/ListActionTest.java index 09d635c964c..1654fa4cf65 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/pr/ws/ListActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/pr/ws/ListActionTest.java @@ -140,7 +140,7 @@ public class ListActionTest { @Test public void pull_request() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) @@ -173,7 +173,7 @@ public class ListActionTest { @Test public void pull_requests() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto nonMainBranch = db.components().insertProjectBranch(project, b -> b.setKey("branch1").setBranchType(BranchType.BRANCH)); @@ -201,7 +201,7 @@ public class ListActionTest { @Test public void base_branch_is_using_default_main_name_when_main_branch_has_no_name() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setKey("pr-123") @@ -221,7 +221,7 @@ public class ListActionTest { @Test public void pull_request_on_removed_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setKey("pr-123") @@ -241,7 +241,7 @@ public class ListActionTest { @Test public void status_on_pull_requests() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto nonMainBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)); ComponentDto pullRequest = db.components().insertProjectBranch(project, @@ -274,7 +274,7 @@ public class ListActionTest { @Test public void status_on_pull_request_with_no_issue() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto nonMainBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)); db.components().insertProjectBranch(project, @@ -300,7 +300,7 @@ public class ListActionTest { Long previousAnalysisPullRequest = dateToLong(parseDateTime("2017-04-02T00:00:00+0100")); Long lastAnalysisPullRequest = dateToLong(parseDateTime("2017-04-03T00:00:00+0100")); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto pullRequest1 = db.components().insertProjectBranch(project, @@ -340,7 +340,7 @@ public class ListActionTest { @Test public void does_not_fail_when_only_browse_permission_on_project() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) @@ -359,7 +359,7 @@ public class ListActionTest { @Test public void does_not_fail_when_only_scan_permission_on_project() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) @@ -380,7 +380,7 @@ public class ListActionTest { public void does_not_fail_when_only_scan_permission_on_organization() { OrganizationDto organization = db.organizations().insert(); userSession.logIn().addPermission(OrganizationPermission.SCAN, organization); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) @@ -397,14 +397,14 @@ public class ListActionTest { } @Test - public void fail_when_using_branch_db_key() throws Exception { + public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); ws.newRequest() .setParam("project", branch.getDbKey()) @@ -425,8 +425,8 @@ public class ListActionTest { ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(project)); userSession.logIn().addProjectPermission(UserRole.USER, project); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Invalid project key"); + expectedException.expect(NotFoundException.class); + expectedException.expectMessage("Project '" + file.getDbKey() + "' not found"); ws.newRequest() .setParam("project", file.getDbKey()) @@ -436,7 +436,7 @@ public class ListActionTest { @Test public void fail_if_project_does_not_exist() { expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component key 'foo' not found"); + expectedException.expectMessage("Project 'foo' not found"); ws.newRequest() .setParam("project", "foo") @@ -445,7 +445,7 @@ public class ListActionTest { @Test public void fail_when_not_having_right_permission() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/DeleteActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/DeleteActionTest.java index 6b0614fc5d9..920933dddcb 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/DeleteActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/DeleteActionTest.java @@ -28,6 +28,7 @@ import org.sonar.api.utils.System2; import org.sonar.api.web.UserRole; 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.server.component.ComponentCleanerService; import org.sonar.server.component.ComponentFinder; @@ -63,7 +64,7 @@ public class DeleteActionTest { @Test public void delete_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("branch1")); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); @@ -72,7 +73,7 @@ public class DeleteActionTest { .setParam("branch", "branch1") .execute(); - verifyDeletedKey(branch.getDbKey()); + verifyDeletedKey("branch1"); verify(projectLifeCycleListeners).onProjectBranchesDeleted(singleton(Project.from(project))); } @@ -123,7 +124,7 @@ public class DeleteActionTest { userSession.logIn(); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Project key 'foo' not found"); + expectedException.expectMessage("Project 'foo' not found"); tester.newRequest() .setParam("project", "foo") @@ -133,7 +134,7 @@ public class DeleteActionTest { @Test public void fail_if_branch_is_main() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); db.executeUpdateSql("UPDATE project_branches set KEE = 'main'"); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); @@ -158,9 +159,9 @@ public class DeleteActionTest { } private void verifyDeletedKey(String key) { - ArgumentCaptor<ComponentDto> argument = ArgumentCaptor.forClass(ComponentDto.class); + ArgumentCaptor<BranchDto> argument = ArgumentCaptor.forClass(BranchDto.class); verify(componentCleanerService).deleteBranch(any(DbSession.class), argument.capture()); - assertThat(argument.getValue().getDbKey()).isEqualTo(key); + assertThat(argument.getValue().getKey()).isEqualTo(key); } } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/ListActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/ListActionTest.java index 900ab318634..fff49e9d67f 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/ListActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/ListActionTest.java @@ -20,6 +20,7 @@ package org.sonar.server.branch.ws; import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -42,7 +43,6 @@ import org.sonar.server.permission.index.PermissionIndexerTester; import org.sonar.server.tester.UserSessionRule; import org.sonar.server.ws.WsActionTester; import org.sonarqube.ws.Common.BranchType; -import org.sonarqube.ws.MediaTypes; import org.sonarqube.ws.ProjectBranches; import org.sonarqube.ws.ProjectBranches.Branch; import org.sonarqube.ws.ProjectBranches.ListWsResponse; @@ -82,7 +82,7 @@ public class ListActionTest { public WsActionTester ws = new WsActionTester(new ListAction(db.getDbClient(), userSession, new ComponentFinder(db.getDbClient(), resourceTypes))); @Before - public void setUp() throws Exception { + public void setUp() { qualityGateStatus = db.measures().insertMetric(m -> m.setKey(ALERT_STATUS_KEY)); } @@ -98,7 +98,7 @@ public class ListActionTest { @Test public void test_example() { - ComponentDto project = db.components().insertMainBranch(p -> p.setDbKey("sonarqube")); + ComponentDto project = db.components().insertPrivateProject(p -> p.setDbKey("sonarqube")); db.getDbClient().snapshotDao().insert(db.getSession(), newAnalysis(project).setLast(true).setCreatedAt(parseDateTime("2017-04-01T01:15:42+0100").getTime())); db.measures().insertLiveMeasure(project, qualityGateStatus, m -> m.setData("ERROR")); @@ -127,7 +127,7 @@ public class ListActionTest { @Test public void test_with_SCAN_EXCUTION_permission() { - ComponentDto project = db.components().insertMainBranch(p -> p.setDbKey("sonarqube")); + ComponentDto project = db.components().insertPrivateProject(p -> p.setDbKey("sonarqube")); db.getDbClient().snapshotDao().insert(db.getSession(), newAnalysis(project).setLast(true).setCreatedAt(parseDateTime("2017-04-01T01:15:42+0100").getTime())); db.measures().insertLiveMeasure(project, qualityGateStatus, m -> m.setData("ERROR")); @@ -154,7 +154,7 @@ public class ListActionTest { @Test public void main_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn().addProjectPermission(USER, project); ListWsResponse response = ws.newRequest() @@ -169,11 +169,13 @@ public class ListActionTest { @Test public void main_branch_with_specified_name() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization, "head"); + ComponentDto project = db.components().insertPrivateProject(organization); + db.getDbClient().branchDao().updateMainBranchName(db.getSession(), project.uuid(), "head"); + db.commit(); userSession.logIn().addProjectPermission(USER, project); ListWsResponse response = ws.newRequest() - .setParam("project", project.getDbKey()) + .setParam("project", project.getKey()) .executeProtobuf(ListWsResponse.class); assertThat(response.getBranchesList()) @@ -182,21 +184,8 @@ public class ListActionTest { } @Test - public void test_project_with_zero_branches() { - ComponentDto project = db.components().insertPrivateProject(); - userSession.logIn().addProjectPermission(USER, project); - - String json = ws.newRequest() - .setParam("project", project.getDbKey()) - .setMediaType(MediaTypes.JSON) - .execute() - .getInput(); - assertJson(json).isSimilarTo("{\"branches\": []}"); - } - - @Test public void test_project_with_branches() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); db.components().insertProjectBranch(project, b -> b.setKey("feature/bar")); db.components().insertProjectBranch(project, b -> b.setKey("feature/foo")); userSession.logIn().addProjectPermission(USER, project); @@ -215,7 +204,7 @@ public class ListActionTest { @Test public void status_on_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn().addProjectPermission(USER, project); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(org.sonar.db.component.BranchType.BRANCH)); db.measures().insertLiveMeasure(branch, qualityGateStatus, m -> m.setData("OK")); @@ -233,7 +222,7 @@ public class ListActionTest { public void response_contains_date_of_last_analysis() { Long lastAnalysisBranch = dateToLong(parseDateTime("2017-04-01T00:00:00+0100")); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn().addProjectPermission(USER, project); ComponentDto branch2 = db.components().insertProjectBranch(project, b -> b.setBranchType(org.sonar.db.component.BranchType.BRANCH)); db.getDbClient().snapshotDao().insert(db.getSession(), @@ -268,6 +257,7 @@ public class ListActionTest { assertThat(response.getBranchesList()) .extracting(Branch::getName, Branch::getType) .containsExactlyInAnyOrder( + tuple("master", BranchType.BRANCH), tuple("feature/foo", BranchType.BRANCH), tuple("feature/bar", BranchType.BRANCH)); } @@ -275,12 +265,12 @@ public class ListActionTest { @Test public void fail_when_using_branch_db_key() throws Exception { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(USER, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); ws.newRequest() .setParam("project", branch.getDbKey()) @@ -301,8 +291,8 @@ public class ListActionTest { ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(project)); userSession.logIn().addProjectPermission(USER, project); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Invalid project"); + expectedException.expect(NotFoundException.class); + expectedException.expectMessage("Project '" + file.getDbKey() + "' not found"); ws.newRequest() .setParam("project", file.getDbKey()) @@ -312,7 +302,7 @@ public class ListActionTest { @Test public void fail_if_project_does_not_exist() { expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component key 'foo' not found"); + expectedException.expectMessage("Project 'foo' not found"); ws.newRequest() .setParam("project", "foo") diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/RenameActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/RenameActionTest.java index a9adce8af26..e446284eab7 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/RenameActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/RenameActionTest.java @@ -94,7 +94,7 @@ public class RenameActionTest { @Test public void fail_if_no_administer_permission() { userSession.logIn(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); expectedException.expect(ForbiddenException.class); expectedException.expectMessage("Insufficient privileges"); @@ -108,7 +108,7 @@ public class RenameActionTest { @Test public void rename() { userSession.logIn(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("branch")); userSession.addProjectPermission(UserRole.ADMIN, project); @@ -128,7 +128,7 @@ public class RenameActionTest { @Test public void rename_with_same_name() { userSession.logIn(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("branch")); userSession.addProjectPermission(UserRole.ADMIN, project); @@ -153,7 +153,7 @@ public class RenameActionTest { @Test public void fail_if_name_already_used() { userSession.logIn(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); userSession.addProjectPermission(UserRole.ADMIN, project); db.components().insertProjectBranch(project, b -> b.setKey("branch")); @@ -171,7 +171,7 @@ public class RenameActionTest { userSession.logIn(); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Project key 'foo' not found"); + expectedException.expectMessage("Project 'foo' not found"); tester.newRequest() .setParam("project", "foo") diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionActionTest.java index f5318c42d85..f8ed9a1668f 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionActionTest.java @@ -110,7 +110,7 @@ public class SetAutomaticDeletionProtectionActionTest { @Test public void fail_if_no_administer_permission() { userSession.logIn(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); expectedException.expect(ForbiddenException.class); expectedException.expectMessage("Insufficient privileges"); @@ -125,7 +125,7 @@ public class SetAutomaticDeletionProtectionActionTest { @Test public void fail_when_attempting_to_set_main_branch_as_included_in_purge() { userSession.logIn(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("branch1").setExcludeFromPurge(false)); userSession.addProjectPermission(UserRole.ADMIN, project); expectedException.expect(IllegalArgumentException.class); @@ -141,7 +141,7 @@ public class SetAutomaticDeletionProtectionActionTest { @Test public void set_purge_exclusion() { userSession.logIn(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("branch1").setExcludeFromPurge(false)); userSession.addProjectPermission(UserRole.ADMIN, project); @@ -164,7 +164,7 @@ public class SetAutomaticDeletionProtectionActionTest { @Test public void fail_on_non_boolean_value_parameter() { userSession.logIn(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Value of parameter 'value' (foobar) must be one of: [true, false, yes, no]"); @@ -181,7 +181,7 @@ public class SetAutomaticDeletionProtectionActionTest { userSession.logIn(); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Project key 'foo' not found"); + expectedException.expectMessage("Project 'foo' not found"); tester.newRequest() .setParam("project", "foo") @@ -193,7 +193,7 @@ public class SetAutomaticDeletionProtectionActionTest { @Test public void fail_if_branch_does_not_exist() { userSession.logIn(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); userSession.addProjectPermission(UserRole.ADMIN, project); expectedException.expect(NotFoundException.class); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/queue/BranchReportSubmitterTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/queue/BranchReportSubmitterTest.java index 609392d3055..cc06ba33093 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/queue/BranchReportSubmitterTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/queue/BranchReportSubmitterTest.java @@ -102,7 +102,7 @@ public class BranchReportSubmitterTest { @Test public void submit_does_not_use_delegate_if_characteristics_are_empty() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); UserDto user = db.users().insertUser(); userSession.logIn(user).addProjectPermission(SCAN_EXECUTION, project); mockSuccessfulPrepareSubmitCall(); @@ -116,7 +116,7 @@ public class BranchReportSubmitterTest { @Test public void submit_a_report_on_existing_branch() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); ComponentDto branch = db.components().insertProjectBranch(project); UserDto user = db.users().insertUser(); userSession.logIn(user).addProjectPermission(SCAN_EXECUTION, project); @@ -141,7 +141,7 @@ public class BranchReportSubmitterTest { @Test public void submit_a_report_on_missing_branch_but_existing_project() { OrganizationDto organization = db.organizations().insert(); - ComponentDto existingProject = db.components().insertMainBranch(organization); + ComponentDto existingProject = db.components().insertPublicProject(organization); BranchDto exitingProjectMainBranch = db.getDbClient().branchDao().selectByUuid(db.getSession(), existingProject.uuid()).get(); UserDto user = db.users().insertUser(); userSession.logIn(user).addProjectPermission(SCAN_EXECUTION, existingProject); @@ -181,8 +181,8 @@ public class BranchReportSubmitterTest { BranchSupport.ComponentKey componentKey = createComponentKeyOfBranch(createdBranch); when(branchSupportDelegate.createComponentKey(nonExistingProject.getDbKey(), randomCharacteristics)) .thenReturn(componentKey); - when(componentUpdater.createWithoutCommit(any(), any(), eq(user.getId()))) - .thenAnswer((Answer<ComponentDto>) invocation -> db.components().insertMainBranch(nonExistingProject)); + when(componentUpdater.createWithoutCommit(any(), any(), eq(user.getId()), any())) + .thenAnswer((Answer<ComponentDto>) invocation -> db.components().insertPrivateProject(nonExistingProject)); when(branchSupportDelegate.createBranchComponent(any(DbSession.class), same(componentKey), eq(organization), eq(nonExistingProject), any())) .thenReturn(createdBranch); when(permissionTemplateService.wouldUserHaveScanPermissionWithDefaultTemplate(any(DbSession.class), eq(organization.getUuid()), any(), eq(nonExistingProject.getKey()))) @@ -204,7 +204,7 @@ public class BranchReportSubmitterTest { @Test public void submit_fails_if_branch_support_delegate_createComponentKey_throws_an_exception() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); UserDto user = db.users().insertUser(); userSession.logIn(user).addProjectPermission(SCAN_EXECUTION, project); Map<String, String> randomCharacteristics = randomNonEmptyMap(); @@ -259,7 +259,7 @@ public class BranchReportSubmitterTest { private static ComponentDto createButDoNotInsertBranch(ComponentDto project) { BranchType randomBranchType = BranchType.values()[new Random().nextInt(BranchType.values().length)]; BranchDto branchDto = newBranchDto(project.projectUuid(), randomBranchType); - return ComponentTesting.newProjectBranch(project, branchDto); + return ComponentTesting.newBranchComponent(project, branchDto); } private String mockSuccessfulPrepareSubmitCall() { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java index 8b0f0764249..0e49a09b093 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/ActivityActionTest.java @@ -396,7 +396,7 @@ public class ActivityActionTest { @Test public void branch_in_past_activity() { logInAsSystemAdministrator(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BRANCH)); SnapshotDto analysis = db.components().insertSnapshot(branch); @@ -437,7 +437,7 @@ public class ActivityActionTest { @Test public void pull_request_in_past_activity() { logInAsSystemAdministrator(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST)); SnapshotDto analysis = db.components().insertSnapshot(pullRequest); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/AnalysisStatusActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/AnalysisStatusActionTest.java index 4854f802eb6..af85b110726 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/AnalysisStatusActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/AnalysisStatusActionTest.java @@ -19,15 +19,10 @@ */ package org.sonar.server.ce.ws; -import com.tngtech.java.junit.dataprovider.DataProvider; -import com.tngtech.java.junit.dataprovider.DataProviderRunner; -import com.tngtech.java.junit.dataprovider.UseDataProvider; -import java.util.function.Function; import javax.annotation.Nullable; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; import org.sonar.api.utils.System2; import org.sonar.api.web.UserRole; import org.sonar.db.DbClient; @@ -35,9 +30,9 @@ import org.sonar.db.DbTester; import org.sonar.db.ce.CeActivityDto; import org.sonar.db.ce.CeQueueDto; import org.sonar.db.ce.CeTaskMessageDto; +import org.sonar.db.component.BranchDao; 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.organization.OrganizationDto; import org.sonar.server.component.TestComponentFinder; @@ -55,7 +50,6 @@ import static org.sonar.server.ce.ws.CeWsParameters.PARAM_COMPONENT; import static org.sonar.server.ce.ws.CeWsParameters.PARAM_PULL_REQUEST; import static org.sonar.test.JsonAssert.assertJson; -@RunWith(DataProviderRunner.class) public class AnalysisStatusActionTest { private static final String BRANCH_WITH_WARNING = "feature-with-warning"; private static final String BRANCH_WITHOUT_WARNING = "feature-without-warning"; @@ -103,36 +97,12 @@ public class AnalysisStatusActionTest { } @Test - @UseDataProvider("nonProjectComponentFactory") - public void fail_if_component_is_not_a_project(Function<ComponentDto, ComponentDto> nonProjectComponentFactory) { - expectedException.expect(BadRequestException.class); - expectedException.expectMessage("must be a project"); - - ComponentDto project = db.components().insertPrivateProject(); - userSession.addProjectPermission(UserRole.USER, project); - - ComponentDto component = nonProjectComponentFactory.apply(project); - db.components().insertComponent(component); - - ws.newRequest() - .setParam(PARAM_COMPONENT, component.getKey()) - .execute(); - } - - @DataProvider - public static Object[][] nonProjectComponentFactory() { - return new Object[][] { - {(Function<ComponentDto, ComponentDto>) ComponentTesting::newModuleDto}, - {(Function<ComponentDto, ComponentDto>) p -> ComponentTesting.newDirectory(p, "foo")}, - {(Function<ComponentDto, ComponentDto>) ComponentTesting::newFileDto} - }; - } - - @Test public void json_example() { OrganizationDto organization = db.organizations().insert(o -> o.setKey("my-org-1")); ComponentDto project = db.components().insertPrivateProject(organization, p -> p.setUuid("AU_w74XMgAS1Hm6h4-Y-"), + p -> p.setProjectUuid("AU_w74XMgAS1Hm6h4-Y-"), + p -> p.setRootUuid("AU_w74XMgAS1Hm6h4-Y-"), p -> p.setDbKey("com.github.kevinsawicki:http-request-parent"), p -> p.setName("HttpRequest")); @@ -344,8 +314,7 @@ public class AnalysisStatusActionTest { db.commit(); } - private CeActivityDto insertActivity(String taskUuid, ComponentDto component, CeActivityDto.Status status, - @Nullable SnapshotDto analysis, String taskType) { + private CeActivityDto insertActivity(String taskUuid, ComponentDto component, CeActivityDto.Status status, @Nullable SnapshotDto analysis, String taskType) { CeQueueDto queueDto = new CeQueueDto(); queueDto.setTaskType(taskType); queueDto.setComponent(component); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/ComponentActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/ComponentActionTest.java index 297a922df39..935276da9d1 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/ComponentActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/ComponentActionTest.java @@ -177,7 +177,7 @@ public class ComponentActionTest { @Test public void branch_in_activity() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BRANCH)); SnapshotDto analysis = db.components().insertSnapshot(branch); @@ -197,7 +197,7 @@ public class ComponentActionTest { @Test public void branch_in_queue_analysis() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BRANCH)); CeQueueDto queue1 = insertQueue("T1", project, IN_PROGRESS); @@ -220,7 +220,7 @@ public class ComponentActionTest { @Test public void return_many_tasks_from_same_project() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); insertQueue("Main", project, IN_PROGRESS); ComponentDto branch1 = db.components().insertProjectBranch(project, b -> b.setBranchType(BRANCH).setKey("branch1")); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/TaskActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/TaskActionTest.java index 92c51807ef9..737e218d99a 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/TaskActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ce/ws/TaskActionTest.java @@ -164,7 +164,7 @@ public class TaskActionTest { @Test public void branch_in_past_activity() { logInAsRoot(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BRANCH)); db.components().insertSnapshot(branch); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java index 96692860c75..78a9562de39 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentCleanerServiceTest.java @@ -22,27 +22,22 @@ package org.sonar.server.component; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.sonar.api.resources.ResourceType; -import org.sonar.api.resources.ResourceTypes; import org.sonar.api.utils.System2; 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.ComponentTesting; import org.sonar.db.component.SnapshotDto; import org.sonar.db.issue.IssueDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.webhook.WebhookDto; import org.sonar.server.es.TestProjectIndexers; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static org.sonar.db.component.ComponentTesting.newFileDto; import static org.sonar.server.es.ProjectIndexer.Cause.PROJECT_DELETION; public class ComponentCleanerServiceTest { @@ -58,8 +53,7 @@ public class ComponentCleanerServiceTest { private DbClient dbClient = db.getDbClient(); private DbSession dbSession = db.getSession(); private TestProjectIndexers projectIndexers = new TestProjectIndexers(); - private ResourceTypes mockResourceTypes = mock(ResourceTypes.class); - private ComponentCleanerService underTest = new ComponentCleanerService(dbClient, mockResourceTypes, projectIndexers); + private ComponentCleanerService underTest = new ComponentCleanerService(dbClient, projectIndexers); @Test public void delete_project_from_db_and_index() { @@ -92,7 +86,7 @@ public class ComponentCleanerServiceTest { DbData data2 = insertData(); DbData data3 = insertData(); - underTest.deleteBranch(dbSession, data1.project); + underTest.deleteBranch(dbSession, data1.branch); dbSession.commit(); assertNotExists(data1); @@ -103,110 +97,63 @@ public class ComponentCleanerServiceTest { @Test public void delete_webhooks_from_projects() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project1 = db.components().insertPrivateProject(organization); + ProjectDto project1 = db.components().insertPrivateProjectDto(organization); WebhookDto webhook1 = db.webhooks().insertWebhook(project1); db.webhookDelivery().insert(webhook1); - ComponentDto project2 = db.components().insertPrivateProject(organization); + ProjectDto project2 = db.components().insertPrivateProjectDto(organization); WebhookDto webhook2 = db.webhooks().insertWebhook(project2); db.webhookDelivery().insert(webhook2); - ComponentDto projectNotToBeDeleted = db.components().insertPrivateProject(organization); + ProjectDto projectNotToBeDeleted = db.components().insertPrivateProjectDto(organization); WebhookDto webhook3 = db.webhooks().insertWebhook(projectNotToBeDeleted); db.webhookDelivery().insert(webhook3); - mockResourceTypeAsValidProject(); - underTest.delete(dbSession, asList(project1, project2)); + ProjectDto projectDto1 = dbClient.projectDao().selectByUuid(dbSession, project1.getUuid()).get(); + ProjectDto projectDto2 = dbClient.projectDao().selectByUuid(dbSession, project2.getUuid()).get(); + + underTest.delete(dbSession, asList(projectDto1, projectDto2)); assertThat(db.countRowsOfTable(db.getSession(), "webhooks")).isEqualTo(1); assertThat(db.countRowsOfTable(db.getSession(), "webhook_deliveries")).isEqualTo(1); } - @Test - public void fail_with_IAE_if_not_a_project() { - mockResourceTypeAsValidProject(); - ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - dbClient.componentDao().insert(dbSession, project); - ComponentDto file = newFileDto(project, null); - dbClient.componentDao().insert(dbSession, file); - dbSession.commit(); - - expectedException.expect(IllegalArgumentException.class); - underTest.delete(dbSession, file); - } - - @Test - public void fail_to_delete_not_deletable_resource_type() { - ResourceType resourceType = mock(ResourceType.class); - when(resourceType.getBooleanProperty("deletable")).thenReturn(false); - when(mockResourceTypes.get(anyString())).thenReturn(resourceType); - ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - dbClient.componentDao().insert(dbSession, project); - dbSession.commit(); - - expectedException.expect(IllegalArgumentException.class); - underTest.delete(dbSession, project); - } - - @Test - public void fail_to_delete_null_resource_type() { - when(mockResourceTypes.get(anyString())).thenReturn(null); - ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - dbClient.componentDao().insert(dbSession, project); - dbSession.commit(); - - expectedException.expect(IllegalArgumentException.class); - underTest.delete(dbSession, project); - } - - @Test - public void fail_to_delete_project_when_branch() { - ComponentDto project = db.components().insertMainBranch(); - ComponentDto branch = db.components().insertProjectBranch(project); - - expectedException.expect(IllegalArgumentException.class); - - underTest.delete(dbSession, branch); - } - private DbData insertData() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPrivateProject(organization); + ComponentDto componentDto = db.components().insertPublicProject(organization); + ProjectDto project = dbClient.projectDao().selectByUuid(dbSession, componentDto.uuid()).get(); + BranchDto branch = dbClient.branchDao().selectByUuid(dbSession, project.getUuid()).get(); + ComponentDto component = dbClient.componentDao().selectByKey(dbSession, project.getKey()).get(); RuleDefinitionDto rule = db.rules().insert(); - IssueDto issue = db.issues().insert(rule, project, project); - SnapshotDto analysis = db.components().insertSnapshot(project); - mockResourceTypeAsValidProject(); - return new DbData(project, analysis, issue); - } - - private void mockResourceTypeAsValidProject() { - ResourceType resourceType = mock(ResourceType.class); - when(resourceType.getBooleanProperty(anyString())).thenReturn(true); - when(mockResourceTypes.get(anyString())).thenReturn(resourceType); + IssueDto issue = db.issues().insert(rule, project, component); + SnapshotDto analysis = db.components().insertSnapshot(component); + return new DbData(project, branch, analysis, issue); } private void assertNotExists(DbData data) { assertDataInDb(data, false); - - assertThat(projectIndexers.hasBeenCalled(data.project.uuid(), PROJECT_DELETION)).isTrue(); + assertThat(projectIndexers.hasBeenCalled(data.branch.getUuid(), PROJECT_DELETION)).isTrue(); } private void assertExists(DbData data) { assertDataInDb(data, true); - assertThat(projectIndexers.hasBeenCalled(data.project.uuid(), PROJECT_DELETION)).isFalse(); + assertThat(projectIndexers.hasBeenCalled(data.branch.getUuid(), PROJECT_DELETION)).isFalse(); } private void assertDataInDb(DbData data, boolean exists) { - assertThat(dbClient.componentDao().selectByUuid(dbSession, data.project.uuid()).isPresent()).isEqualTo(exists); + assertThat(dbClient.componentDao().selectByUuid(dbSession, data.project.getUuid()).isPresent()).isEqualTo(exists); + assertThat(dbClient.branchDao().selectByUuid(dbSession, data.branch.getUuid()).isPresent()).isEqualTo(exists); assertThat(dbClient.snapshotDao().selectByUuid(dbSession, data.snapshot.getUuid()).isPresent()).isEqualTo(exists); assertThat(dbClient.issueDao().selectByKey(dbSession, data.issue.getKey()).isPresent()).isEqualTo(exists); } private static class DbData { - final ComponentDto project; + final ProjectDto project; + final BranchDto branch; final SnapshotDto snapshot; final IssueDto issue; - DbData(ComponentDto project, SnapshotDto snapshot, IssueDto issue) { + DbData(ProjectDto project, BranchDto branch, SnapshotDto snapshot, IssueDto issue) { this.project = project; + this.branch = branch; this.snapshot = snapshot; this.issue = issue; } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentFinderTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentFinderTest.java index 1c94f46aeed..9a640c8ac0a 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentFinderTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentFinderTest.java @@ -97,7 +97,7 @@ public class ComponentFinderTest { @Test public void fail_to_getByUuidOrKey_when_using_branch_uuid() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); @@ -108,7 +108,7 @@ public class ComponentFinderTest { @Test public void fail_to_getByUuidOrKey_when_using_branch_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); @@ -130,7 +130,7 @@ public class ComponentFinderTest { @Test public void fail_to_getByUuid_on_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); @@ -152,7 +152,7 @@ public class ComponentFinderTest { @Test public void fail_getByKey_on_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); @@ -181,7 +181,7 @@ public class ComponentFinderTest { @Test public void get_by_key_and_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("my_branch")); ComponentDto module = db.components().insertComponent(newModuleDto(branch)); ComponentDto directory = db.components().insertComponent(newDirectory(module, "scr")); @@ -195,7 +195,7 @@ public class ComponentFinderTest { @Test public void get_by_key_and_pull_request() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("pr-123").setBranchType(PULL_REQUEST).setMergeBranchUuid(project.uuid())); ComponentDto module = db.components().insertComponent(newModuleDto(branch)); ComponentDto directory = db.components().insertComponent(newDirectory(module, "scr")); @@ -209,7 +209,7 @@ public class ComponentFinderTest { @Test public void fail_when_pull_request_branch_provided() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setKey("pr-123").setBranchType(PULL_REQUEST)); expectedException.expect(IllegalArgumentException.class); @@ -220,7 +220,7 @@ public class ComponentFinderTest { @Test public void get_by_key_and_branch_accept_main_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); assertThat(underTest.getByKeyAndBranch(dbSession, project.getKey(), "master").uuid()).isEqualTo(project.uuid()); } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentServiceTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentServiceTest.java index da3a2a42fd1..46da8abb584 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentServiceTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentServiceTest.java @@ -28,7 +28,6 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; -import org.sonar.db.component.ComponentTesting; import org.sonar.server.es.TestProjectIndexers; import org.sonar.server.project.ProjectLifeCycleListeners; import org.sonar.server.tester.UserSessionRule; @@ -57,13 +56,13 @@ public class ComponentServiceTest { @Test public void bulk_update() { - ComponentDto project = componentDb.insertComponent(ComponentTesting.newPrivateProjectDto(dbTester.organizations().insert()).setDbKey("my_project")); + ComponentDto project = componentDb.insertPublicProject(dbTester.organizations().insert(), c -> c.setDbKey("my_project")); ComponentDto module = componentDb.insertComponent(newModuleDto(project).setDbKey("my_project:root:module")); ComponentDto inactiveModule = componentDb.insertComponent(newModuleDto(project).setDbKey("my_project:root:inactive_module").setEnabled(false)); ComponentDto file = componentDb.insertComponent(newFileDto(module, null).setDbKey("my_project:root:module:src/File.xoo")); ComponentDto inactiveFile = componentDb.insertComponent(newFileDto(module, null).setDbKey("my_project:root:module:src/InactiveFile.xoo").setEnabled(false)); - - underTest.bulkUpdateKey(dbSession, project, "my_", "your_"); + + underTest.bulkUpdateKey(dbSession, componentDb.getProjectDto(project), "my_", "your_"); assertComponentKeyUpdated(project.getDbKey(), "your_project"); assertComponentKeyUpdated(module.getDbKey(), "your_project:root:module"); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java index 8f3efd2780b..ffa9529b3ca 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ComponentServiceUpdateKeyTest.java @@ -67,14 +67,14 @@ public class ComponentServiceUpdateKeyTest { @Test public void update_project_key() { - ComponentDto project = insertSampleRootProject(); + ComponentDto project = insertSampleProject(); ComponentDto file = componentDb.insertComponent(ComponentTesting.newFileDto(project, null).setDbKey("sample:root:src/File.xoo")); ComponentDto inactiveFile = componentDb.insertComponent(ComponentTesting.newFileDto(project, null).setDbKey("sample:root:src/InactiveFile.xoo").setEnabled(false)); dbSession.commit(); logInAsProjectAdministrator(project); - underTest.updateKey(dbSession, project, "sample2:root"); + underTest.updateKey(dbSession, componentDb.getProjectDto(project), "sample2:root"); dbSession.commit(); // Check project key has been updated @@ -92,33 +92,13 @@ public class ComponentServiceUpdateKeyTest { } @Test - public void update_module_key() { - ComponentDto project = insertSampleRootProject(); - ComponentDto module = ComponentTesting.newModuleDto(project).setDbKey("sample:root:module"); - db.components().insertComponent(module); - ComponentDto file = ComponentTesting.newFileDto(module, null).setDbKey("sample:root:module:src/File.xoo"); - db.components().insertComponent(file); - logInAsProjectAdministrator(project); - - underTest.updateKey(dbSession, module, "sample:root2:module"); - dbSession.commit(); - - assertThat(dbClient.componentDao().selectByKey(dbSession, project.getDbKey())).isPresent(); - assertComponentKeyHasBeenUpdated(module.getDbKey(), "sample:root2:module"); - assertComponentKeyHasBeenUpdated(file.getDbKey(), "sample:root2:module:src/File.xoo"); - - // do not index the module but the project - assertThat(projectIndexers.hasBeenCalled(project.uuid(), ProjectIndexer.Cause.PROJECT_KEY_UPDATE)).isTrue(); - } - - @Test public void update_provisioned_project_key() { ComponentDto provisionedProject = insertProject("provisionedProject"); dbSession.commit(); logInAsProjectAdministrator(provisionedProject); - underTest.updateKey(dbSession, provisionedProject, "provisionedProject2"); + underTest.updateKey(dbSession, componentDb.getProjectDto(provisionedProject), "provisionedProject2"); dbSession.commit(); assertComponentKeyHasBeenUpdated(provisionedProject.getDbKey(), "provisionedProject2"); @@ -129,67 +109,55 @@ public class ComponentServiceUpdateKeyTest { public void fail_to_update_project_key_without_admin_permission() { expectedException.expect(ForbiddenException.class); - ComponentDto project = insertSampleRootProject(); + ComponentDto project = insertSampleProject(); userSession.logIn("john").addProjectPermission(UserRole.USER, project); - underTest.updateKey(dbSession, project, "sample2:root"); + underTest.updateKey(dbSession, componentDb.getProjectDto(project), "sample2:root"); } @Test public void fail_if_old_key_and_new_key_are_the_same() { - ComponentDto project = insertSampleRootProject(); + ComponentDto project = insertSampleProject(); ComponentDto anotherProject = componentDb.insertPrivateProject(); logInAsProjectAdministrator(project); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Impossible to update key: a component with key \"" + anotherProject.getDbKey() + "\" already exists."); - underTest.updateKey(dbSession, project, anotherProject.getDbKey()); + underTest.updateKey(dbSession, componentDb.getProjectDto(project), anotherProject.getDbKey()); } @Test public void fail_if_new_key_is_empty() { - ComponentDto project = insertSampleRootProject(); + ComponentDto project = insertSampleProject(); logInAsProjectAdministrator(project); expectedException.expect(BadRequestException.class); expectedException.expectMessage("Malformed key for ''. It cannot be empty nor contain whitespaces."); - underTest.updateKey(dbSession, project, ""); + underTest.updateKey(dbSession, componentDb.getProjectDto(project), ""); } @Test public void fail_if_new_key_is_invalid() { - ComponentDto project = insertSampleRootProject(); + ComponentDto project = insertSampleProject(); logInAsProjectAdministrator(project); expectedException.expect(BadRequestException.class); expectedException.expectMessage("Malformed key for 'sample root'. It cannot be empty nor contain whitespaces."); - underTest.updateKey(dbSession, project, "sample root"); - } - - @Test - public void fail_if_update_is_not_on_module_or_project() { - ComponentDto project = insertSampleRootProject(); - ComponentDto file = componentDb.insertComponent(newFileDto(project, null)); - logInAsProjectAdministrator(project); - - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Component updated must be a module or a key"); - - underTest.updateKey(dbSession, file, "file:key"); + underTest.updateKey(dbSession, componentDb.getProjectDto(project), "sample root"); } @Test public void bulk_update_key() { - ComponentDto project = componentDb.insertComponent(ComponentTesting.newPrivateProjectDto(db.organizations().insert()).setDbKey("my_project")); + ComponentDto project = componentDb.insertPublicProject(db.organizations().insert(), c -> c.setDbKey("my_project")); ComponentDto module = componentDb.insertComponent(newModuleDto(project).setDbKey("my_project:root:module")); ComponentDto inactiveModule = componentDb.insertComponent(newModuleDto(project).setDbKey("my_project:root:inactive_module").setEnabled(false)); ComponentDto file = componentDb.insertComponent(newFileDto(module, null).setDbKey("my_project:root:module:src/File.xoo")); ComponentDto inactiveFile = componentDb.insertComponent(newFileDto(module, null).setDbKey("my_project:root:module:src/InactiveFile.xoo").setEnabled(false)); - underTest.bulkUpdateKey(dbSession, project, "my_", "your_"); + underTest.bulkUpdateKey(dbSession, componentDb.getProjectDto(project), "my_", "your_"); assertComponentKeyUpdated(project.getDbKey(), "your_project"); assertComponentKeyUpdated(module.getDbKey(), "your_project:root:module"); @@ -203,12 +171,12 @@ public class ComponentServiceUpdateKeyTest { @Test public void bulk_update_key_with_branch_and_pr() { - ComponentDto project = componentDb.insertComponent(ComponentTesting.newPrivateProjectDto(db.organizations().insert()).setDbKey("my_project")); + ComponentDto project = componentDb.insertPublicProject(db.organizations().insert(), c -> c.setDbKey("my_project")); ComponentDto branch = componentDb.insertProjectBranch(project); ComponentDto module = componentDb.insertComponent(newModuleDto(branch).setDbKey("my_project:root:module")); ComponentDto file = componentDb.insertComponent(newFileDto(module, null).setDbKey("my_project:root:module:src/File.xoo")); - underTest.bulkUpdateKey(dbSession, project, "my_", "your_"); + underTest.bulkUpdateKey(dbSession, componentDb.getProjectDto(project), "my_", "your_"); assertComponentKeyUpdated(project.getDbKey(), "your_project"); assertComponentKeyUpdated(module.getDbKey(), "your_project:root:module"); @@ -223,12 +191,12 @@ public class ComponentServiceUpdateKeyTest { assertThat(dbClient.componentDao().selectByKey(dbSession, newKey)).isPresent(); } - private ComponentDto insertSampleRootProject() { + private ComponentDto insertSampleProject() { return insertProject("sample:root"); } private ComponentDto insertProject(String key) { - return componentDb.insertComponent(ComponentTesting.newPrivateProjectDto(db.organizations().insert()).setDbKey(key)); + return componentDb.insertPrivateProject(db.organizations().insert(), c -> c.setDbKey(key)); } private void assertComponentKeyHasBeenUpdated(String oldKey, String newKey) { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/AppActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/AppActionTest.java index b50b2d3e252..5675a87bace 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/AppActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/AppActionTest.java @@ -253,7 +253,7 @@ public class AppActionTest { @Test public void branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn("john").addProjectPermission(USER, project); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto module = db.components().insertComponent(newModuleDto(branch)); @@ -298,7 +298,7 @@ public class AppActionTest { @Test public void component_and_branch_parameters_provided() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn("john").addProjectPermission(USER, project); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto file = db.components().insertComponent(newFileDto(branch)); @@ -327,7 +327,7 @@ public class AppActionTest { @Test public void component_and_pull_request_parameters_provided() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn("john").addProjectPermission(USER, project); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(PULL_REQUEST)); ComponentDto file = db.components().insertComponent(newFileDto(branch)); @@ -356,7 +356,7 @@ public class AppActionTest { @Test public void fail_if_component_and_pull_request_and_branch_parameters_provided() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn("john").addProjectPermission(USER, project); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(PULL_REQUEST)); ComponentDto file = db.components().insertComponent(newFileDto(branch)); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SearchActionTest.java index 5b26ad74198..c8a9f8664d9 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SearchActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SearchActionTest.java @@ -232,7 +232,7 @@ public class SearchActionTest { @Test public void does_not_return_branches() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); setBrowsePermissionOnUserAndIndex(project, branch); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java index 4260eac8c61..a7b562ee6d3 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java @@ -1101,7 +1101,7 @@ public class SearchProjectsActionTest { @Test public void does_not_return_branches() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); authorizationIndexerTester.allowOnlyAnyone(project); ComponentDto branch = db.components().insertProjectBranch(project); projectMeasuresIndexer.indexOnStartup(null); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/ShowActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/ShowActionTest.java index b78481c17b8..477c0bfe876 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/ShowActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/ShowActionTest.java @@ -260,7 +260,7 @@ public class ShowActionTest { @Test public void branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); String branchKey = "my_branch"; ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey(branchKey)); @@ -286,7 +286,7 @@ public class ShowActionTest { @Test public void pull_request() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); String pullRequest = "pr-1234"; ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey(pullRequest).setBranchType(PULL_REQUEST)); @@ -359,7 +359,7 @@ public class ShowActionTest { @Test public void fail_when_using_branch_db_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java index 65cb985b526..0fc26582443 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/SuggestionsActionTest.java @@ -614,7 +614,7 @@ public class SuggestionsActionTest { @Test public void does_not_return_branches() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); authorizationIndexerTester.allowOnlyAnyone(project); ComponentDto branch = db.components().insertProjectBranch(project); componentIndexer.indexOnStartup(null); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/TreeActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/TreeActionTest.java index a4b0fdba84e..830792ef4a0 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/TreeActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/component/ws/TreeActionTest.java @@ -277,7 +277,7 @@ public class TreeActionTest { @Test public void project_branch_reference_from_application_branch() { - ComponentDto application = db.components().insertMainBranch(c -> c.setQualifier(APP).setDbKey("app-key")); + ComponentDto application = db.components().insertPrivateProject(c -> c.setQualifier(APP).setDbKey("app-key")); ComponentDto applicationBranch = db.components().insertProjectBranch(application, a -> a.setKey("app-branch")); ComponentDto project = db.components().insertPrivateProject(p -> p.setDbKey("project-key")); ComponentDto projectBranch = db.components().insertProjectBranch(project, b -> b.setKey("project-branch")); @@ -381,7 +381,7 @@ public class TreeActionTest { @Test public void fail_when_using_branch_db_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); @@ -395,7 +395,7 @@ public class TreeActionTest { @Test public void fail_when_using_branch_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/DuplicationsParserTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/DuplicationsParserTest.java index f46c1a16def..deceb0b01aa 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/DuplicationsParserTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/DuplicationsParserTest.java @@ -246,7 +246,7 @@ public class DuplicationsParserTest { @Test public void duplication_on_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto file1 = db.components().insertComponent(newFileDto(branch)); ComponentDto file2 = db.components().insertComponent(newFileDto(branch)); @@ -278,7 +278,7 @@ public class DuplicationsParserTest { @Test public void duplication_on_pull_request() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST)); ComponentDto file1 = db.components().insertComponent(newFileDto(pullRequest)); ComponentDto file2 = db.components().insertComponent(newFileDto(pullRequest)); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/ShowActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/ShowActionTest.java index ba39434d382..b5ebb7b7c94 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/ShowActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/ShowActionTest.java @@ -110,7 +110,7 @@ public class ShowActionTest { @Test public void duplications_by_file_key_and_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto file = db.components().insertComponent(newFileDto(branch)); @@ -162,7 +162,7 @@ public class ShowActionTest { @Test public void duplications_by_file_key_and_pull_request() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST)); ComponentDto file = db.components().insertComponent(newFileDto(pullRequest)); @@ -240,7 +240,7 @@ public class ShowActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project); ComponentDto branch = db.components().insertProjectBranch(project); @@ -255,7 +255,7 @@ public class ShowActionTest { @Test public void fail_when_using_branch_uuid() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/ShowResponseBuilderTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/ShowResponseBuilderTest.java index b97979fe4dc..e873c3e84af 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/ShowResponseBuilderTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/duplication/ws/ShowResponseBuilderTest.java @@ -206,7 +206,7 @@ public class ShowResponseBuilderTest { @Test public void write_duplications_on_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto file1 = db.components().insertComponent(newFileDto(branch)); ComponentDto file2 = db.components().insertComponent(newFileDto(branch)); @@ -250,7 +250,7 @@ public class ShowResponseBuilderTest { @Test public void write_duplications_on_pull_request() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setBranchType(PULL_REQUEST)); ComponentDto file1 = db.components().insertComponent(newFileDto(pullRequest)); ComponentDto file2 = db.components().insertComponent(newFileDto(pullRequest)); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/favorite/ws/AddActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/favorite/ws/AddActionTest.java index e3339f20732..fe01076c628 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/favorite/ws/AddActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/favorite/ws/AddActionTest.java @@ -139,7 +139,7 @@ public class AddActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); ComponentDto branch = db.components().insertProjectBranch(project); UserDto user = db.users().insertUser(); userSession.logIn(user).addProjectPermission(USER, project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/favorite/ws/RemoveActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/favorite/ws/RemoveActionTest.java index 8cf7249e8ca..8983cb11860 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/favorite/ws/RemoveActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/favorite/ws/RemoveActionTest.java @@ -108,7 +108,7 @@ public class RemoveActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java index fbde4cf6bb3..7b1b0a68cc4 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/WebIssueStorageTest.java @@ -89,7 +89,7 @@ public class WebIssueStorageTest { @Test public void insert_new_issues() { RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto module = db.components().insertComponent(newModuleDto(project)); ComponentDto file = db.components().insertComponent(newFileDto(module)); @@ -139,7 +139,7 @@ public class WebIssueStorageTest { @Test public void update_issues() { RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto module = db.components().insertComponent(newModuleDto(project)); ComponentDto file = db.components().insertComponent(newFileDto(module)); @@ -225,7 +225,7 @@ public class WebIssueStorageTest { @Test public void rule_id_is_set_on_updated_issue() { RuleDefinitionDto rule = db.rules().insert(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto module = db.components().insertComponent(newModuleDto(project)); ComponentDto file = db.components().insertComponent(newFileDto(module)); DefaultIssue issue = newIssue(rule, project, file).toDefaultIssue(); @@ -239,7 +239,7 @@ public class WebIssueStorageTest { @Test public void rule_id_is_not_set_on_updated_issue_when_rule_is_removed() { RuleDefinitionDto rule = db.rules().insert(r -> r.setStatus(REMOVED)); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto module = db.components().insertComponent(newModuleDto(project)); ComponentDto file = db.components().insertComponent(newFileDto(module)); DefaultIssue issue = newIssue(rule, project, file).toDefaultIssue(); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/BulkChangeActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/BulkChangeActionTest.java index 8530ed40c1c..c428152f718 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/BulkChangeActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/BulkChangeActionTest.java @@ -299,7 +299,7 @@ public class BulkChangeActionTest { public void send_notification() { UserDto user = db.users().insertUser(); userSession.logIn(user); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); addUserProjectPermissions(user, project, USER, ISSUE_ADMIN); RuleDefinitionDto rule = db.rules().insertIssueRule(); @@ -336,7 +336,7 @@ public class BulkChangeActionTest { public void should_ignore_hotspots() { UserDto user = db.users().insertUser(); userSession.logIn(user); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); addUserProjectPermissions(user, project, USER, SECURITYHOTSPOT_ADMIN); IssueDto issue = db.issues().insertHotspot(project, file); @@ -355,7 +355,7 @@ public class BulkChangeActionTest { public void send_notification_on_branch() { UserDto user = db.users().insertUser(); userSession.logIn(user); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("feature").setBranchType(BranchType.BRANCH)); ComponentDto fileOnBranch = db.components().insertComponent(newFileDto(branch)); addUserProjectPermissions(user, project, USER, ISSUE_ADMIN); @@ -392,7 +392,7 @@ public class BulkChangeActionTest { private void verifySendNoNotification(BranchType branchType) { UserDto user = db.users().insertUser(); userSession.logIn(user); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("feature").setBranchType(branchType)); ComponentDto fileOnBranch = db.components().insertComponent(newFileDto(branch)); addUserProjectPermissions(user, project, USER, ISSUE_ADMIN); @@ -415,7 +415,7 @@ public class BulkChangeActionTest { public void send_notification_only_on_changed_issues() { UserDto user = db.users().insertUser(); userSession.logIn(user); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); addUserProjectPermissions(user, project, USER, ISSUE_ADMIN); RuleDefinitionDto rule = db.rules().insertIssueRule(); @@ -451,7 +451,7 @@ public class BulkChangeActionTest { public void ignore_the_issues_that_do_not_match_conditions() { UserDto user = db.users().insertUser(); userSession.logIn(user); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto file1 = db.components().insertComponent(newFileDto(project)); ComponentDto file2 = db.components().insertComponent(newFileDto(project)); addUserProjectPermissions(user, project, USER, ISSUE_ADMIN); @@ -485,7 +485,7 @@ public class BulkChangeActionTest { public void ignore_issues_when_there_is_nothing_to_do() { UserDto user = db.users().insertUser(); userSession.logIn(user); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto file1 = db.components().insertComponent(newFileDto(project)); ComponentDto file2 = db.components().insertComponent(newFileDto(project)); addUserProjectPermissions(user, project, USER, ISSUE_ADMIN); @@ -519,7 +519,7 @@ public class BulkChangeActionTest { public void add_comment_only_on_changed_issues() { UserDto user = db.users().insertUser(); userSession.logIn(user); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto file1 = db.components().insertComponent(newFileDto(project)); ComponentDto file2 = db.components().insertComponent(newFileDto(project)); addUserProjectPermissions(user, project, USER, ISSUE_ADMIN); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/DoTransitionActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/DoTransitionActionTest.java index b058e8286f9..78fe3209594 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/DoTransitionActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/DoTransitionActionTest.java @@ -115,7 +115,7 @@ public class DoTransitionActionTest { @Test public void do_transition() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); RuleDefinitionDto rule = db.rules().insertIssueRule(); IssueDto issue = db.issues().insertIssue(rule, project, file, i -> i.setStatus(STATUS_OPEN).setResolution(null).setType(CODE_SMELL)); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/IssueUpdaterTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/IssueUpdaterTest.java index 76ef431f83f..6923a3b09d2 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/IssueUpdaterTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/IssueUpdaterTest.java @@ -109,7 +109,7 @@ public class IssueUpdaterTest { public void verify_notification_without_resolution() { UserDto assignee = db.users().insertUser(); RuleDefinitionDto rule = db.rules().insertIssueRule(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); DefaultIssue issue = db.issues().insertIssue(rule, project, file, t -> t.setSeverity(MAJOR).setAssigneeUuid(assignee.getUuid())) @@ -138,7 +138,7 @@ public class IssueUpdaterTest { public void verify_notification_with_resolution() { UserDto assignee = db.users().insertUser(); RuleDefinitionDto rule = db.rules().insertIssueRule(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); DefaultIssue issue = db.issues().insertIssue(rule, project, file, t -> t.setSeverity(MAJOR).setAssigneeUuid(assignee.getUuid())) @@ -166,7 +166,7 @@ public class IssueUpdaterTest { @Test public void verify_notification_on_branch() { RuleDefinitionDto rule = db.rules().insertIssueRule(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, t -> t.setBranchType(BRANCH)); ComponentDto file = db.components().insertComponent(newFileDto(branch)); DefaultIssue issue = db.issues().insertIssue(rule, branch, file, @@ -194,7 +194,7 @@ public class IssueUpdaterTest { @Test public void verify_no_notification_on_pr() { RuleDefinitionDto rule = db.rules().insertIssueRule(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project, t -> t.setBranchType(BranchType.PULL_REQUEST)); ComponentDto file = db.components().insertComponent(newFileDto(branch)); DefaultIssue issue = db.issues().insertIssue(rule, branch, file, t -> t.setSeverity(MAJOR)).toDefaultIssue(); @@ -209,7 +209,7 @@ public class IssueUpdaterTest { @Test public void verify_notification_when_issue_is_linked_on_removed_rule() { RuleDefinitionDto rule = db.rules().insertIssueRule(r -> r.setStatus(RuleStatus.REMOVED)); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); DefaultIssue issue = db.issues().insertIssue(rule, project, file, t -> t.setSeverity(MAJOR)).toDefaultIssue(); IssueChangeContext context = IssueChangeContext.createUser(new Date(), "user_uuid"); @@ -224,7 +224,7 @@ public class IssueUpdaterTest { public void verify_notification_when_assignee_has_changed() { UserDto oldAssignee = db.users().insertUser(); RuleDefinitionDto rule = db.rules().insertIssueRule(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); DefaultIssue issue = db.issues().insertIssue(rule, project, file, t -> t.setAssigneeUuid(oldAssignee.getUuid())) .toDefaultIssue(); @@ -252,7 +252,7 @@ public class IssueUpdaterTest { @Test public void saveIssue_populates_specified_SearchResponseData_with_rule_project_and_component_retrieved_from_DB() { RuleDefinitionDto rule = db.rules().insertIssueRule(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); IssueDto issueDto = db.issues().insertIssue(rule, project, file); DefaultIssue issue = issueDto.setSeverity(MAJOR).toDefaultIssue(); @@ -278,7 +278,7 @@ public class IssueUpdaterTest { @Test public void saveIssue_populates_specified_SearchResponseData_with_no_rule_but_with_project_and_component_if_rule_is_removed() { RuleDefinitionDto rule = db.rules().insertIssueRule(r -> r.setStatus(RuleStatus.REMOVED)); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); IssueDto issueDto = db.issues().insertIssue(rule, project, file); DefaultIssue issue = issueDto.setSeverity(MAJOR).toDefaultIssue(); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java index ddcd67fd5c4..2e98ebe35ec 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java @@ -454,7 +454,7 @@ public class SearchActionComponentsTest { @Test public void search_by_application_key_and_branch() { - ComponentDto application = db.components().insertMainBranch(c -> c.setQualifier(APP).setDbKey("app")); + ComponentDto application = db.components().insertPrivateProject(c -> c.setQualifier(APP).setDbKey("app")); ComponentDto applicationBranch1 = db.components().insertProjectBranch(application, a -> a.setKey("app-branch1")); ComponentDto applicationBranch2 = db.components().insertProjectBranch(application, a -> a.setKey("app-branch2")); ComponentDto project1 = db.components().insertPrivateProject(p -> p.setDbKey("prj1")); @@ -655,7 +655,7 @@ public class SearchActionComponentsTest { @Test public void search_by_branch() { RuleDefinitionDto rule = db.rules().insertIssueRule(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); IssueDto issue = db.issues().insertIssue(rule, project, file); @@ -744,7 +744,7 @@ public class SearchActionComponentsTest { @Test public void search_using_main_branch_name() { RuleDefinitionDto rule = db.rules().insertIssueRule(); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto projectFile = db.components().insertComponent(newFileDto(project)); IssueDto projectIssue = db.issues().insertIssue(rule, project, projectFile); allowAnyoneOnProjects(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SetTagsActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SetTagsActionTest.java index b6acfc186ab..f7962b41382 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SetTagsActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SetTagsActionTest.java @@ -213,7 +213,7 @@ public class SetTagsActionTest { @Test public void fail_when_security_hotspot() { RuleDefinitionDto rule = db.rules().insertHotspotRule(); - ComponentDto project = db.components().insertMainBranch(newPublicProjectDto(db.getDefaultOrganization())); + ComponentDto project = db.components().insertPublicProject(newPublicProjectDto(db.getDefaultOrganization())); ComponentDto file = db.components().insertComponent(newFileDto(project)); IssueDto issueDto = db.issues().insertHotspot(rule, project, file); logIn(issueDto); @@ -246,7 +246,7 @@ public class SetTagsActionTest { @SafeVarargs private final IssueDto insertIssueForPublicProject(Consumer<IssueDto>... consumers) { RuleDefinitionDto rule = db.rules().insertIssueRule(); - ComponentDto project = db.components().insertMainBranch(newPublicProjectDto(db.getDefaultOrganization())); + ComponentDto project = db.components().insertPublicProject(newPublicProjectDto(db.getDefaultOrganization())); ComponentDto file = db.components().insertComponent(newFileDto(project)); return db.issues().insertIssue(rule, project, file, consumers); } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SetTypeActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SetTypeActionTest.java index 41c32966137..f55e37287f4 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SetTypeActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SetTypeActionTest.java @@ -228,7 +228,7 @@ public class SetTypeActionTest { private IssueDto newIssueWithProject(RuleType type) { RuleDefinitionDto rule = dbTester.rules().insert(); - ComponentDto project = dbTester.components().insertMainBranch(); + ComponentDto project = dbTester.components().insertPrivateProject(); ComponentDto file = dbTester.components().insertComponent(newFileDto(project)); return issueDbTester.insert(rule, project, file, i -> i.setType(type)); } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/LiveMeasureComputerImplTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/LiveMeasureComputerImplTest.java index 25cabda4102..9a64112913c 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/LiveMeasureComputerImplTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/LiveMeasureComputerImplTest.java @@ -49,6 +49,7 @@ import org.sonar.db.component.ComponentTesting; import org.sonar.db.measure.LiveMeasureDto; import org.sonar.db.metric.MetricDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.es.ProjectIndexer; import org.sonar.server.es.TestProjectIndexers; import org.sonar.server.measure.Rating; @@ -63,6 +64,7 @@ import static java.util.Collections.emptyList; import static java.util.Collections.singleton; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.mock; @@ -84,6 +86,7 @@ public class LiveMeasureComputerImplTest { private MetricDto alertStatusMetric; private OrganizationDto organization; private ComponentDto project; + private ProjectDto projectDto; private ComponentDto dir; private ComponentDto file1; private ComponentDto file2; @@ -99,7 +102,8 @@ public class LiveMeasureComputerImplTest { ratingMetric = db.measures().insertMetric(m -> m.setValueType(Metric.ValueType.RATING.name())); alertStatusMetric = db.measures().insertMetric(m -> m.setKey(CoreMetrics.ALERT_STATUS_KEY)); organization = db.organizations().insert(); - project = db.components().insertMainBranch(organization); + project = db.components().insertPublicProject(organization); + projectDto = db.components().getProjectDto(project); dir = db.components().insertComponent(ComponentTesting.newDirectory(project, "src/main/java")); file1 = db.components().insertComponent(ComponentTesting.newFileDto(project, dir)); file2 = db.components().insertComponent(ComponentTesting.newFileDto(project, dir)); @@ -260,7 +264,7 @@ public class LiveMeasureComputerImplTest { @Test public void refresh_multiple_projects_at_the_same_time() { markProjectAsAnalyzed(project); - ComponentDto project2 = db.components().insertMainBranch(); + ComponentDto project2 = db.components().insertPublicProject(); ComponentDto fileInProject2 = db.components().insertComponent(ComponentTesting.newFileDto(project2)); markProjectAsAnalyzed(project2); @@ -365,7 +369,7 @@ public class LiveMeasureComputerImplTest { .extracting(QGChangeEvent::getQualityGateSupplier) .extracting(Supplier::get) .containsExactly(Optional.of(newQualityGate)); - verify(qGateComputer).loadQualityGate(any(DbSession.class), eq(organization), eq(project), eq(branch)); + verify(qGateComputer).loadQualityGate(any(DbSession.class), eq(organization), argThat(p -> p.getUuid().equals(projectDto.getUuid())), eq(branch)); verify(qGateComputer).getMetricsRelatedTo(qualityGate); verify(qGateComputer).refreshGateStatus(eq(project), same(qualityGate), any(MeasureMatrix.class)); } @@ -390,7 +394,7 @@ public class LiveMeasureComputerImplTest { private List<QGChangeEvent> run(Collection<ComponentDto> components, IssueMetricFormula... formulas) { IssueMetricFormulaFactory formulaFactory = new TestIssueMetricFormulaFactory(asList(formulas)); - when(qGateComputer.loadQualityGate(any(DbSession.class), any(OrganizationDto.class), any(ComponentDto.class), any(BranchDto.class))) + when(qGateComputer.loadQualityGate(any(DbSession.class), any(OrganizationDto.class), any(ProjectDto.class), any(BranchDto.class))) .thenReturn(qualityGate); when(qGateComputer.getMetricsRelatedTo(qualityGate)).thenReturn(singleton(CoreMetrics.ALERT_STATUS_KEY)); when(qGateComputer.refreshGateStatus(eq(project), same(qualityGate), any(MeasureMatrix.class))) @@ -496,7 +500,7 @@ public class LiveMeasureComputerImplTest { assertThat(projectIndexer.hasBeenCalled(p.uuid(), ProjectIndexer.Cause.MEASURE_CHANGE)).isTrue(); } - assertThat(events).extracting(e -> e.getProject().uuid()) + assertThat(events).extracting(e -> e.getBranch().getUuid()) .containsExactlyInAnyOrder(Arrays.stream(projects).map(ComponentDto::uuid).toArray(String[]::new)); } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/LiveQualityGateComputerImplTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/LiveQualityGateComputerImplTest.java index 20d1752e576..ef718d263d6 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/LiveQualityGateComputerImplTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/LiveQualityGateComputerImplTest.java @@ -36,6 +36,7 @@ import org.sonar.db.component.ComponentTesting; import org.sonar.db.measure.LiveMeasureDto; import org.sonar.db.metric.MetricDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.server.qualitygate.Condition; @@ -51,7 +52,6 @@ import static java.util.Collections.emptyList; import static java.util.Collections.singleton; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.groups.Tuple.tuple; -import static org.sonar.db.component.ComponentTesting.newBranchDto; import static org.sonar.db.metric.MetricTesting.newMetricDto; import static org.sonar.db.organization.OrganizationTesting.newOrganizationDto; @@ -69,10 +69,8 @@ public class LiveQualityGateComputerImplTest { @Test public void loadQualityGate_returns_hardcoded_gate_for_pull_requests() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPublicProject(organization); - - BranchDto branch = newBranchDto(project).setBranchType(BranchType.PULL_REQUEST); - db.components().insertProjectBranch(project, branch); + ProjectDto project = db.components().insertPublicProjectDto(organization); + BranchDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST)); MetricDto metric1 = db.measures().insertMetric(m -> m.setKey("new_metric")); MetricDto metric2 = db.measures().insertMetric(m -> m.setKey("metric")); @@ -89,9 +87,8 @@ public class LiveQualityGateComputerImplTest { @Test public void loadQualityGate_on_branch_returns_organization_default_gate() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPublicProject(organization); - BranchDto branch = newBranchDto(project).setBranchType(BranchType.BRANCH); - db.components().insertProjectBranch(project, branch); + ProjectDto project = db.components().insertPublicProjectDto(organization); + BranchDto branch = db.components().insertProjectBranch(project).setBranchType(BranchType.BRANCH); MetricDto metric = db.measures().insertMetric(); QGateWithOrgDto gate = db.qualityGates().insertQualityGate(organization); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentActionTest.java index 3c9d1c71d97..c33e2ff0438 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentActionTest.java @@ -397,7 +397,7 @@ public class ComponentActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); MetricDto metric = db.measures().insertMetric(m -> m.setValueType("INT")); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentTreeActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentTreeActionTest.java index ec8ee12c60c..6080cebae15 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentTreeActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/ComponentTreeActionTest.java @@ -713,7 +713,7 @@ public class ComponentTreeActionTest { @Test public void project_branch_reference_from_application_branch() { MetricDto ncloc = insertNclocMetric(); - ComponentDto application = db.components().insertMainBranch(c -> c.setQualifier(APP).setDbKey("app-key")); + ComponentDto application = db.components().insertPublicProject(c -> c.setQualifier(APP).setDbKey("app-key")); ComponentDto applicationBranch = db.components().insertProjectBranch(application, a -> a.setKey("app-branch")); ComponentDto project = db.components().insertPrivateProject(p -> p.setDbKey("project-key")); ComponentDto projectBranch = db.components().insertProjectBranch(project, b -> b.setKey("project-branch")); @@ -980,7 +980,7 @@ public class ComponentTreeActionTest { @Test public void fail_when_using_branch_db_key() throws Exception { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); insertNclocMetric(); @@ -997,7 +997,7 @@ public class ComponentTreeActionTest { @Test public void fail_when_using_branch_uuid() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); insertNclocMetric(); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/SearchActionTest.java index bb4f0183c13..ecbaebd9b8c 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/SearchActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/SearchActionTest.java @@ -279,7 +279,7 @@ public class SearchActionTest { @Test public void does_not_return_branch_when_using_db_key() { MetricDto coverage = db.measures().insertMetric(m -> m.setValueType(FLOAT.name())); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto branch = db.components().insertProjectBranch(project); db.measures().insertLiveMeasure(branch, coverage, m -> m.setValue(10d)); userSession.addProjectPermission(UserRole.USER, project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/SearchHistoryActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/SearchHistoryActionTest.java index 63ec76fcaae..b90294b4e0e 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/SearchHistoryActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/ws/SearchHistoryActionTest.java @@ -343,7 +343,7 @@ public class SearchHistoryActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/ListActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/ListActionTest.java index 1b9208690e6..6efb0b67638 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/ListActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/ListActionTest.java @@ -84,7 +84,7 @@ public class ListActionTest { @Test public void throw_NFE_if_project_not_found() { expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component key 'unknown' not found"); + expectedException.expectMessage("Project 'unknown' not found"); ws.newRequest() .setParam("project", "unknown") @@ -93,7 +93,7 @@ public class ListActionTest { @Test public void throw_FE_if_no_project_permission() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); expectedException.expect(ForbiddenException.class); expectedException.expectMessage("Insufficient privileges"); @@ -104,7 +104,7 @@ public class ListActionTest { @Test public void list_only_branches() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); createBranches(project, 5, BranchType.BRANCH); createBranches(project, 3, BranchType.PULL_REQUEST); @@ -127,7 +127,7 @@ public class ListActionTest { @Test public void list_inherited_global_settings() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); tester.insert(new NewCodePeriodDto().setType(NewCodePeriodType.SPECIFIC_ANALYSIS).setValue("uuid")); createBranches(project, 5, BranchType.BRANCH); @@ -154,8 +154,8 @@ public class ListActionTest { @Test public void list_inherited_project_settings() { - ComponentDto projectWithOwnSettings = componentDb.insertMainBranch(); - ComponentDto projectWithGlobalSettings = componentDb.insertMainBranch(); + ComponentDto projectWithOwnSettings = componentDb.insertPublicProject(); + ComponentDto projectWithGlobalSettings = componentDb.insertPublicProject(); tester.insert(new NewCodePeriodDto() .setType(NewCodePeriodType.SPECIFIC_ANALYSIS) .setValue("global_uuid")); @@ -207,7 +207,7 @@ public class ListActionTest { @Test public void list_branch_and_inherited_global_settings() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); ComponentDto branchWithOwnSettings = componentDb.insertProjectBranch(project, branchDto -> branchDto.setKey("OWN_SETTINGS")); componentDb.insertProjectBranch(project, branchDto -> branchDto.setKey("GLOBAL_SETTINGS")); @@ -257,7 +257,7 @@ public class ListActionTest { @Test public void list_branch_and_inherited_project_settings() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); ComponentDto branchWithOwnSettings = componentDb.insertProjectBranch(project, branchDto -> branchDto.setKey("OWN_SETTINGS")); componentDb.insertProjectBranch(project, branchDto -> branchDto.setKey("PROJECT_SETTINGS")); @@ -312,7 +312,7 @@ public class ListActionTest { @Test public void verify_specific_analysis_effective_value() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); ComponentDto branch = componentDb.insertProjectBranch(project, branchDto -> branchDto.setKey("PROJECT_BRANCH")); SnapshotDto analysis = componentDb.insertSnapshot(newAnalysis(project) diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/SetActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/SetActionTest.java index e0fa2821f19..2ebdbdbf1a5 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/SetActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/SetActionTest.java @@ -136,7 +136,7 @@ public class SetActionTest { @Test public void throw_IAE_if_no_value_for_days() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("New Code Period type 'NUMBER_OF_DAYS' requires a value"); @@ -150,7 +150,7 @@ public class SetActionTest { @Test public void throw_IAE_if_no_value_for_analysis() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("New Code Period type 'SPECIFIC_ANALYSIS' requires a value"); @@ -164,7 +164,7 @@ public class SetActionTest { @Test public void throw_IAE_if_days_is_invalid() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Failed to parse number of days: unknown"); @@ -179,7 +179,7 @@ public class SetActionTest { @Test public void throw_IAE_if_analysis_is_not_found() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); expectedException.expect(NotFoundException.class); expectedException.expectMessage("Analysis 'unknown' is not found"); @@ -194,7 +194,7 @@ public class SetActionTest { @Test public void throw_IAE_if_analysis_doesnt_belong_to_branch() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); ComponentDto branch = componentDb.insertProjectBranch(project, b -> b.setKey("branch")); SnapshotDto analysisMaster = db.components().insertSnapshot(project); @@ -226,7 +226,7 @@ public class SetActionTest { @Test public void throw_NFE_if_project_not_found() { expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component key 'unknown' not found"); + expectedException.expectMessage("Project 'unknown' not found"); ws.newRequest() .setParam("type", "previous_version") @@ -236,10 +236,10 @@ public class SetActionTest { @Test public void throw_NFE_if_branch_not_found() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component '" + project.getKey() + "' on branch 'unknown' not found"); + expectedException.expectMessage("Branch 'unknown' in project '" + project.getKey() + "' not found"); ws.newRequest() .setParam("project", project.getKey()) @@ -251,7 +251,7 @@ public class SetActionTest { // permission @Test public void throw_NFE_if_no_project_permission() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); expectedException.expect(ForbiddenException.class); expectedException.expectMessage("Insufficient privileges"); @@ -284,7 +284,7 @@ public class SetActionTest { @Test public void set_project_period_to_number_of_days() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); ws.newRequest() .setParam("project", project.getKey()) @@ -298,7 +298,7 @@ public class SetActionTest { @UseDataProvider("provideNewCodePeriodTypeAndValue") public void never_set_project_value_in_community_edition(NewCodePeriodType type, @Nullable String value) { when(editionProvider.get()).thenReturn(Optional.of(EditionProvider.Edition.COMMUNITY)); - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); if (value != null && NewCodePeriodType.SPECIFIC_ANALYSIS.equals(type)) { db.components().insertSnapshot(project, snapshotDto -> snapshotDto.setUuid(value)); @@ -328,7 +328,7 @@ public class SetActionTest { @Test public void set_project_twice_period_to_number_of_days() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); ws.newRequest() .setParam("project", project.getKey()) @@ -346,7 +346,7 @@ public class SetActionTest { @Test public void set_branch_period_to_analysis() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); ComponentDto branch = componentDb.insertProjectBranch(project, b -> b.setKey("branch")); SnapshotDto analysisMaster = db.components().insertSnapshot(project); @@ -366,7 +366,7 @@ public class SetActionTest { @Test public void set_branch_period_twice_to_analysis() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); ComponentDto branch = componentDb.insertProjectBranch(project, b -> b.setKey("branch")); SnapshotDto analysisMaster = db.components().insertSnapshot(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/ShowActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/ShowActionTest.java index eb6b3c42af8..e2cbfdea650 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/ShowActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/ShowActionTest.java @@ -90,7 +90,7 @@ public class ShowActionTest { @Test public void throw_NFE_if_project_not_found() { expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component key 'unknown' not found"); + expectedException.expectMessage("Project 'unknown' not found"); ws.newRequest() .setParam("project", "unknown") @@ -99,10 +99,10 @@ public class ShowActionTest { @Test public void throw_NFE_if_branch_not_found() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component '" + project.getKey() + "' on branch 'unknown' not found"); + expectedException.expectMessage("Branch 'unknown' in project '" + project.getKey() + "' not found"); ws.newRequest() .setParam("project", project.getKey()) @@ -112,7 +112,7 @@ public class ShowActionTest { @Test public void throw_FE_if_no_project_permission() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); expectedException.expect(ForbiddenException.class); expectedException.expectMessage("Insufficient privileges"); @@ -133,7 +133,7 @@ public class ShowActionTest { @Test public void show_project_setting() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); tester.insert(new NewCodePeriodDto() @@ -150,7 +150,7 @@ public class ShowActionTest { @Test public void show_branch_setting() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); ComponentDto branch = componentDb.insertProjectBranch(project, b -> b.setKey("branch")); @@ -171,7 +171,7 @@ public class ShowActionTest { @Test public void show_inherited_project_setting() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); tester.insert(new NewCodePeriodDto().setType(NewCodePeriodType.PREVIOUS_VERSION)); @@ -184,7 +184,7 @@ public class ShowActionTest { @Test public void show_inherited_branch_setting_from_project() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); ComponentDto branch = componentDb.insertProjectBranch(project, b -> b.setKey("branch")); @@ -204,7 +204,7 @@ public class ShowActionTest { @Test public void show_inherited_branch_setting_from_global() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); ComponentDto branch = componentDb.insertProjectBranch(project, b -> b.setKey("branch")); tester.insert(new NewCodePeriodDto().setType(NewCodePeriodType.NUMBER_OF_DAYS).setValue("3")); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/UnsetActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/UnsetActionTest.java index 616499c2374..5d487bf550a 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/UnsetActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/newcodeperiod/ws/UnsetActionTest.java @@ -95,7 +95,7 @@ public class UnsetActionTest { @Test public void throw_NFE_if_project_not_found() { expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component key 'unknown' not found"); + expectedException.expectMessage("Project 'unknown' not found"); ws.newRequest() .setParam("type", "previous_version") @@ -105,10 +105,10 @@ public class UnsetActionTest { @Test public void throw_NFE_if_branch_not_found() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component '" + project.getKey() + "' on branch 'unknown' not found"); + expectedException.expectMessage("Branch 'unknown' in project '" + project.getKey() + "' not found"); ws.newRequest() .setParam("project", project.getKey()) @@ -120,7 +120,7 @@ public class UnsetActionTest { // permission @Test public void throw_NFE_if_no_project_permission() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); expectedException.expect(ForbiddenException.class); expectedException.expectMessage("Insufficient privileges"); @@ -152,7 +152,7 @@ public class UnsetActionTest { @Test public void delete_project_period() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); logInAsProjectAdministrator(project); ws.newRequest() .setParam("project", project.getKey()) @@ -163,8 +163,8 @@ public class UnsetActionTest { @Test public void delete_project_period_twice() { - ComponentDto project1 = componentDb.insertMainBranch(); - ComponentDto project2 = componentDb.insertMainBranch(); + ComponentDto project1 = componentDb.insertPublicProject(); + ComponentDto project2 = componentDb.insertPublicProject(); db.newCodePeriods().insert(project1.uuid(), null, NewCodePeriodType.SPECIFIC_ANALYSIS, "uuid1"); db.newCodePeriods().insert(project2.uuid(), null, NewCodePeriodType.SPECIFIC_ANALYSIS, "uuid2"); @@ -183,7 +183,7 @@ public class UnsetActionTest { @Test public void delete_branch_period() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); ComponentDto branch = componentDb.insertProjectBranch(project, b -> b.setKey("branch")); db.newCodePeriods().insert(project.uuid(), null, NewCodePeriodType.SPECIFIC_ANALYSIS, "uuid1"); @@ -201,7 +201,7 @@ public class UnsetActionTest { @Test public void delete_branch_and_project_period_in_community_edition() { - ComponentDto project = componentDb.insertMainBranch(); + ComponentDto project = componentDb.insertPublicProject(); db.newCodePeriods().insert(project.uuid(), null, NewCodePeriodType.SPECIFIC_ANALYSIS, "uuid1"); db.newCodePeriods().insert(project.uuid(), project.uuid(), NewCodePeriodType.SPECIFIC_ANALYSIS, "uuid2"); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/notification/ws/AddActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/notification/ws/AddActionTest.java index c16cebf20ad..fb5f26017c0 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/notification/ws/AddActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/notification/ws/AddActionTest.java @@ -331,7 +331,7 @@ public class AddActionTest { UserDto user = db.users().insertUser(); userSession.logIn(user); when(dispatchers.getProjectDispatchers()).thenReturn(singletonList(NOTIF_MY_NEW_ISSUES)); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/notification/ws/RemoveActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/notification/ws/RemoveActionTest.java index 798ff12656e..54e3c737d62 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/notification/ws/RemoveActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/notification/ws/RemoveActionTest.java @@ -312,7 +312,7 @@ public class RemoveActionTest { userSession.logIn(user); when(dispatchers.getGlobalDispatchers()).thenReturn(singletonList(NOTIF_MY_NEW_ISSUES)); when(dispatchers.getProjectDispatchers()).thenReturn(singletonList(NOTIF_MY_NEW_ISSUES)); - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/organization/ws/DeleteActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/organization/ws/DeleteActionTest.java index cfae928b58e..64d688d29bc 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/organization/ws/DeleteActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/organization/ws/DeleteActionTest.java @@ -39,9 +39,9 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTesting; -import org.sonar.db.component.ResourceTypesRule; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.template.PermissionTemplateDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.qualityprofile.QProfileDto; @@ -74,18 +74,14 @@ import static com.google.common.collect.ImmutableList.of; import static java.util.Arrays.asList; import static java.util.Collections.emptySet; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; -import static org.sonar.api.resources.Qualifiers.APP; -import static org.sonar.api.resources.Qualifiers.PROJECT; -import static org.sonar.api.resources.Qualifiers.VIEW; import static org.sonar.core.util.stream.MoreCollectors.toSet; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER; import static org.sonar.db.user.UserTesting.newUserDto; @@ -105,8 +101,7 @@ public class DeleteActionTest { private DbClient dbClient = db.getDbClient(); private DbSession dbSession = db.getSession(); - private ResourceTypesRule resourceTypes = new ResourceTypesRule().setRootQualifiers(PROJECT, VIEW, APP).setAllQualifiers(PROJECT, VIEW, APP); - private ComponentCleanerService spiedComponentCleanerService = spy(new ComponentCleanerService(db.getDbClient(), resourceTypes, mock(ProjectIndexers.class))); + private ComponentCleanerService spiedComponentCleanerService = spy(new ComponentCleanerService(db.getDbClient(), mock(ProjectIndexers.class))); private TestOrganizationFlags organizationFlags = TestOrganizationFlags.standalone().setEnabled(true); private TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); private QProfileFactory qProfileFactory = new QProfileFactoryImpl(dbClient, mock(UuidFactory.class), System2.INSTANCE, mock(ActiveRuleIndexer.class)); @@ -114,7 +109,8 @@ public class DeleteActionTest { private UserIndexer userIndexer = new UserIndexer(dbClient, es.client()); private ProjectLifeCycleListeners projectLifeCycleListeners = mock(ProjectLifeCycleListeners.class); private BillingValidationsProxy billingValidationsProxy = mock(BillingValidationsProxy.class); - private OrganizationDeleter organizationDeleter = new OrganizationDeleter(dbClient, spiedComponentCleanerService, userIndexer, qProfileFactory, projectLifeCycleListeners, billingValidationsProxy); + private OrganizationDeleter organizationDeleter = new OrganizationDeleter(dbClient, spiedComponentCleanerService, userIndexer, qProfileFactory, projectLifeCycleListeners, + billingValidationsProxy); private WsActionTester wsTester = new WsActionTester(new DeleteAction(userSession, dbClient, defaultOrganizationProvider, organizationFlags, organizationDeleter)); @Test @@ -140,7 +136,7 @@ public class DeleteActionTest { public void organization_deletion_also_ensure_that_webhooks_of_this_organization_if_they_exist_are_cleared() { OrganizationDto organization = db.organizations().insert(); db.webhooks().insertWebhook(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); WebhookDto projectWebhook = db.webhooks().insertWebhook(project); db.webhookDelivery().insert(projectWebhook); userSession.logIn().addPermission(ADMINISTER, organization); @@ -360,7 +356,7 @@ public class DeleteActionTest { @Test public void delete_branches() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); ComponentDto branch = db.components().insertProjectBranch(project); logInAsAdministrator(organization); @@ -495,23 +491,20 @@ public class DeleteActionTest { @UseDataProvider("indexOfFailingProjectDeletion") public void projectLifeCycleListener_are_notified_even_if_deletion_of_a_project_throws_an_Exception(int failingProjectIndex) { OrganizationDto organization = db.organizations().insert(); - ComponentDto[] projects = new ComponentDto[] { - db.components().insertPrivateProject(organization), - db.components().insertPrivateProject(organization), - db.components().insertPrivateProject(organization) + ComponentDto[] components = new ComponentDto[] { + db.components().insertPublicProject(organization), + db.components().insertPublicProject(organization), + db.components().insertPublicProject(organization) }; + ProjectDto[] projects = Arrays.stream(components).map(c -> dbClient.projectDao().selectByUuid(dbSession, c.uuid()).get()).toArray(ProjectDto[]::new); logInAsAdministrator(organization); - RuntimeException expectedException = new RuntimeException("Faking deletion of 2nd project throwing an exception"); - doThrow(expectedException) - .when(spiedComponentCleanerService).delete(any(), eq(projects[failingProjectIndex])); + RuntimeException exception = new RuntimeException("Faking deletion of 2nd project throwing an exception"); + doThrow(exception).when(spiedComponentCleanerService).delete(any(), anyList()); + expectedException.expectMessage(exception.getMessage()); + expectedException.expect(RuntimeException.class); - try { - sendRequest(organization); - fail("A RuntimeException should have been thrown"); - } catch (RuntimeException e) { - assertThat(e).isSameAs(expectedException); - verify(projectLifeCycleListeners).onProjectsDeleted(Arrays.stream(projects).map(Project::from).collect(toSet())); - } + sendRequest(organization); + verify(projectLifeCycleListeners).onProjectsDeleted(Arrays.stream(projects).map(Project::from).collect(toSet())); } @Test diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/organization/ws/OrganizationDeleterTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/organization/ws/OrganizationDeleterTest.java index 7e792145d79..79cf8d209ad 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/organization/ws/OrganizationDeleterTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/organization/ws/OrganizationDeleterTest.java @@ -31,6 +31,7 @@ import java.util.Set; import java.util.stream.IntStream; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.sonar.api.utils.System2; import org.sonar.core.util.UuidFactoryFast; @@ -40,10 +41,10 @@ import org.sonar.db.DbTester; import org.sonar.db.Pagination; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTesting; -import org.sonar.db.component.ResourceTypesRule; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.organization.OrganizationQuery; import org.sonar.db.permission.template.PermissionTemplateDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.qualityprofile.QProfileDto; @@ -70,16 +71,12 @@ import static java.util.Arrays.asList; import static java.util.Collections.emptySet; import static java.util.Collections.singleton; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.sonar.api.resources.Qualifiers.APP; -import static org.sonar.api.resources.Qualifiers.PROJECT; -import static org.sonar.api.resources.Qualifiers.VIEW; import static org.sonar.core.util.stream.MoreCollectors.toSet; import static org.sonar.db.user.UserTesting.newUserDto; import static org.sonar.server.organization.ws.OrganizationDeleter.PAGE_SIZE; @@ -93,11 +90,13 @@ public class OrganizationDeleterTest { private final DbSession dbSession = db.getSession(); @Rule + public ExpectedException exception = ExpectedException.none(); + + @Rule public final EsTester es = EsTester.create(); private final EsClient esClient = es.client(); - private final ResourceTypesRule resourceTypes = new ResourceTypesRule().setRootQualifiers(PROJECT, VIEW, APP).setAllQualifiers(PROJECT, VIEW, APP); - private final ComponentCleanerService componentCleanerService = spy(new ComponentCleanerService(db.getDbClient(), resourceTypes, mock(ProjectIndexers.class))); + private final ComponentCleanerService componentCleanerService = spy(new ComponentCleanerService(db.getDbClient(), mock(ProjectIndexers.class))); private final UserIndex userIndex = new UserIndex(esClient, System2.INSTANCE); private final UserIndexer userIndexer = new UserIndexer(dbClient, esClient); private final ProjectLifeCycleListeners projectLifeCycleListeners = mock(ProjectLifeCycleListeners.class); @@ -122,7 +121,7 @@ public class OrganizationDeleterTest { public void delete_webhooks_of_organization_if_exist() { OrganizationDto organization = db.organizations().insert(); db.webhooks().insertWebhook(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); WebhookDto projectWebhook = db.webhooks().insertWebhook(project); db.webhookDelivery().insert(projectWebhook); @@ -174,7 +173,6 @@ public class OrganizationDeleterTest { return project; }).collect(toSet()); - underTest.delete(dbSession, organization); verifyOrganizationDoesNotExist(organization); @@ -193,7 +191,7 @@ public class OrganizationDeleterTest { @Test public void delete_branches() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); ComponentDto branch = db.components().insertProjectBranch(project); underTest.delete(dbSession, organization); @@ -319,25 +317,23 @@ public class OrganizationDeleterTest { } @Test - @UseDataProvider("indexOfFailingProjectDeletion") - public void projectLifeCycleListener_are_notified_even_if_deletion_of_a_project_throws_an_Exception(int failingProjectIndex) { + public void projectLifeCycleListener_are_notified_even_if_deletion_of_a_project_throws_an_Exception() { OrganizationDto organization = db.organizations().insert(); - ComponentDto[] projects = new ComponentDto[] { - db.components().insertPrivateProject(organization), - db.components().insertPrivateProject(organization), - db.components().insertPrivateProject(organization) + ComponentDto[] components = new ComponentDto[] { + db.components().insertPublicProject(organization), + db.components().insertPublicProject(organization), + db.components().insertPublicProject(organization) }; + ProjectDto[] projects = Arrays.stream(components).map(c -> dbClient.projectDao().selectByUuid(dbSession, c.uuid()).get()).toArray(ProjectDto[]::new); + RuntimeException expectedException = new RuntimeException("Faking deletion of 2nd project throwing an exception"); - doThrow(expectedException) - .when(componentCleanerService).delete(any(), eq(projects[failingProjectIndex])); - - try { - underTest.delete(dbSession, organization); - fail("A RuntimeException should have been thrown"); - } catch (RuntimeException e) { - assertThat(e).isSameAs(expectedException); - verify(projectLifeCycleListeners).onProjectsDeleted(Arrays.stream(projects).map(Project::from).collect(toSet())); - } + doThrow(expectedException).when(componentCleanerService).delete(any(), anyList()); + exception.expect(RuntimeException.class); + exception.expectMessage(expectedException.getMessage()); + + underTest.delete(dbSession, organization); + + verify(projectLifeCycleListeners).onProjectsDeleted(Arrays.stream(projects).map(Project::from).collect(toSet())); } @Test @@ -359,16 +355,6 @@ public class OrganizationDeleterTest { assertThat(db.getDbClient().organizationAlmBindingDao().selectByOrganization(db.getSession(), organization)).isNotPresent(); } - @DataProvider - public static Object[][] indexOfFailingProjectDeletion() { - return new Object[][] { - {0}, - {1}, - {2} - }; - } - - @Test @UseDataProvider("queriesAndUnmatchedOrganizationKeys") public void delete_organizations_matched_by_query(OrganizationQuery query, Collection<String> unmatchedOrgKeys) { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/AddGroupActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/AddGroupActionTest.java index 46ff9fac6ef..24cd33f2e1d 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/AddGroupActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/AddGroupActionTest.java @@ -459,7 +459,7 @@ public class AddGroupActionTest extends BasePermissionWsTest<AddGroupAction> { public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); GroupDto group = db.users().insertGroup(organization); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); @@ -478,7 +478,7 @@ public class AddGroupActionTest extends BasePermissionWsTest<AddGroupAction> { public void fail_when_using_branch_uuid() { OrganizationDto organization = db.organizations().insert(); GroupDto group = db.users().insertGroup(organization); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/AddUserActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/AddUserActionTest.java index 77845643041..33c3e0a1e1f 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/AddUserActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/AddUserActionTest.java @@ -407,7 +407,7 @@ public class AddUserActionTest extends BasePermissionWsTest<AddUserAction> { public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); addUserAsMemberOfOrganization(organization); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); @@ -426,7 +426,7 @@ public class AddUserActionTest extends BasePermissionWsTest<AddUserAction> { public void fail_when_using_branch_uuid() { OrganizationDto organization = db.organizations().insert(); addUserAsMemberOfOrganization(organization); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/GroupsActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/GroupsActionTest.java index 1cf3ec313b7..e601e8eff7e 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/GroupsActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/GroupsActionTest.java @@ -301,7 +301,7 @@ public class GroupsActionTest extends BasePermissionWsTest<GroupsAction> { @Test public void fail_when_using_branch_uuid() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); GroupDto group = db.users().insertGroup(db.getDefaultOrganization()); db.users().insertProjectPermissionOnGroup(group, ISSUE_ADMIN, project); @@ -318,7 +318,7 @@ public class GroupsActionTest extends BasePermissionWsTest<GroupsAction> { @Test public void fail_when_using_branch_db_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); GroupDto group = db.users().insertGroup(db.getDefaultOrganization()); db.users().insertProjectPermissionOnGroup(group, ISSUE_ADMIN, project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/RemoveGroupActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/RemoveGroupActionTest.java index 897c7ab1a23..3af904b1416 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/RemoveGroupActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/RemoveGroupActionTest.java @@ -437,7 +437,7 @@ public class RemoveGroupActionTest extends BasePermissionWsTest<RemoveGroupActio public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); GroupDto group = db.users().insertGroup(organization); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); @@ -456,7 +456,7 @@ public class RemoveGroupActionTest extends BasePermissionWsTest<RemoveGroupActio public void fail_when_using_branch_uuid() { OrganizationDto organization = db.organizations().insert(); GroupDto group = db.users().insertGroup(organization); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/RemoveUserActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/RemoveUserActionTest.java index 609117860be..0516f1f49e2 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/RemoveUserActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/RemoveUserActionTest.java @@ -355,7 +355,7 @@ public class RemoveUserActionTest extends BasePermissionWsTest<RemoveUserAction> @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); @@ -373,7 +373,7 @@ public class RemoveUserActionTest extends BasePermissionWsTest<RemoveUserAction> @Test public void fail_when_using_branch_uuid() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/SearchProjectPermissionsActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/SearchProjectPermissionsActionTest.java index 4aeceb47a14..ea0d5b814ed 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/SearchProjectPermissionsActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/SearchProjectPermissionsActionTest.java @@ -292,7 +292,7 @@ public class SearchProjectPermissionsActionTest extends BasePermissionWsTest<Sea @Test public void fail_when_using_branch_db_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/UsersActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/UsersActionTest.java index dbb6d346966..5a43967fff8 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/UsersActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/permission/ws/UsersActionTest.java @@ -347,7 +347,7 @@ public class UsersActionTest extends BasePermissionWsTest<UsersAction> { public void fail_when_using_branch_db_key() throws Exception { OrganizationDto organization = db.organizations().insert(); UserDto user = db.users().insertUser(newUserDto()); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); ComponentDto branch = db.components().insertProjectBranch(project); db.users().insertProjectPermissionOnUser(user, ISSUE_ADMIN, project); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); @@ -367,7 +367,7 @@ public class UsersActionTest extends BasePermissionWsTest<UsersAction> { public void fail_when_using_branch_uuid() { OrganizationDto organization = db.organizations().insert(); UserDto user = db.users().insertUser(newUserDto()); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); ComponentDto branch = db.components().insertProjectBranch(project); db.users().insertProjectPermissionOnUser(user, ISSUE_ADMIN, project); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/BulkDeleteActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/BulkDeleteActionTest.java index 9d2e429afc5..07bab119c32 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/BulkDeleteActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/BulkDeleteActionTest.java @@ -42,6 +42,7 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.ComponentCleanerService; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.UnauthorizedException; @@ -109,7 +110,7 @@ public class BulkDeleteActionTest { assertThat(result.getStatus()).isEqualTo(HttpURLConnection.HTTP_NO_CONTENT); assertThat(result.getInput()).isEmpty(); - verifyDeleted(toDeleteInOrg2); + verifyComponentDeleted(toDeleteInOrg2); verifyListenersOnProjectsDeleted(toDeleteInOrg2); } @@ -125,12 +126,12 @@ public class BulkDeleteActionTest { .setParam(PARAM_PROJECTS, toDeleteInOrg1.getDbKey() + "," + toDeleteInOrg2.getDbKey()) .execute(); - verifyDeleted(toDeleteInOrg1, toDeleteInOrg2); + verifyComponentDeleted(toDeleteInOrg1, toDeleteInOrg2); verifyListenersOnProjectsDeleted(toDeleteInOrg1, toDeleteInOrg2); } @Test - public void throw_IllegalArgumentException_if_request_without_any_parameters(){ + public void throw_IllegalArgumentException_if_request_without_any_parameters() { userSession.logIn().setRoot(); db.components().insertPrivateProject(org1); @@ -156,7 +157,7 @@ public class BulkDeleteActionTest { .setParam("projects", toDelete1.getDbKey() + ",missing," + toDelete2.getDbKey() + ",doesNotExist") .execute(); - verifyDeleted(toDelete1, toDelete2); + verifyComponentDeleted(toDelete1, toDelete2); verifyListenersOnProjectsDeleted(toDelete1, toDelete2); } @@ -175,7 +176,7 @@ public class BulkDeleteActionTest { .setParam(PARAM_ANALYZED_BEFORE, formatDate(new Date(recentTime))) .execute(); - verifyDeleted(oldProject); + verifyComponentDeleted(oldProject); verifyListenersOnProjectsDeleted(oldProject); } @@ -188,7 +189,7 @@ public class BulkDeleteActionTest { ws.newRequest().setParam(PARAM_PROJECTS, provisionedProject.getKey() + "," + analyzedProject.getKey()).setParam(PARAM_ON_PROVISIONED_ONLY, "true").execute(); - verifyDeleted(provisionedProject); + verifyComponentDeleted(provisionedProject); verifyListenersOnProjectsDeleted(provisionedProject); } @@ -200,7 +201,7 @@ public class BulkDeleteActionTest { List<String> projectKeys = Stream.of(projects).map(ComponentDto::getKey).collect(Collectors.toList()); ws.newRequest().setParam(PARAM_PROJECTS, String.join(",", projectKeys)).execute(); - verifyDeleted(projects); + verifyComponentDeleted(projects); verifyListenersOnProjectsDeleted(projects); } @@ -215,7 +216,7 @@ public class BulkDeleteActionTest { .setParam(PARAM_QUALIFIERS, String.join(",", Qualifiers.PROJECT, Qualifiers.VIEW)) .execute(); - verifyDeleted(project, view); + verifyComponentDeleted(project, view); verifyListenersOnProjectsDeleted(project, view); } @@ -228,7 +229,7 @@ public class BulkDeleteActionTest { ws.newRequest().setParam(Param.TEXT_QUERY, "JeCt-_%-k").execute(); - verifyDeleted(matchKeyProject, matchUppercaseKeyProject); + verifyComponentDeleted(matchKeyProject, matchUppercaseKeyProject); verifyListenersOnProjectsDeleted(matchKeyProject, matchUppercaseKeyProject); } @@ -281,7 +282,7 @@ public class BulkDeleteActionTest { doNothing() .doThrow(expectedException) .when(componentCleanerService) - .delete(any(), any(ComponentDto.class)); + .delete(any(), any(ProjectDto.class)); try { ws.newRequest() @@ -305,7 +306,7 @@ public class BulkDeleteActionTest { .setParam("projects", toDelete.getDbKey() + "," + cantBeDeleted.getDbKey()) .execute(); - verifyDeleted(toDelete); + verifyComponentDeleted(toDelete); verifyListenersOnProjectsDeleted(toDelete); } @@ -351,7 +352,16 @@ public class BulkDeleteActionTest { verifyZeroInteractions(projectLifeCycleListeners); } - private void verifyDeleted(ComponentDto... projects) { + private void verifyProjectDeleted(ComponentDto... projects) { + ArgumentCaptor<ProjectDto> argument = ArgumentCaptor.forClass(ProjectDto.class); + verify(componentCleanerService, times(projects.length)).delete(any(DbSession.class), argument.capture()); + + for (ComponentDto project : projects) { + assertThat(argument.getAllValues()).extracting(ProjectDto::getUuid).contains(project.uuid()); + } + } + + private void verifyComponentDeleted(ComponentDto... projects) { ArgumentCaptor<ComponentDto> argument = ArgumentCaptor.forClass(ComponentDto.class); verify(componentCleanerService, times(projects.length)).delete(any(DbSession.class), argument.capture()); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/BulkUpdateKeyActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/BulkUpdateKeyActionTest.java index 8eff3a288a1..a85345e71ce 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/BulkUpdateKeyActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/BulkUpdateKeyActionTest.java @@ -31,7 +31,6 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; -import org.sonar.db.component.ComponentTesting; import org.sonar.db.organization.OrganizationDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.ComponentService; @@ -86,9 +85,9 @@ public class BulkUpdateKeyActionTest { @Test public void json_example() { OrganizationDto organizationDto = db.organizations().insert(); - ComponentDto project = componentDb.insertComponent(ComponentTesting.newPrivateProjectDto(organizationDto).setDbKey("my_project")); + ComponentDto project = componentDb.insertPrivateProject(organizationDto, c -> c.setDbKey("my_project")); componentDb.insertComponent(newModuleDto(project).setDbKey("my_project:module_1")); - ComponentDto anotherProject = componentDb.insertComponent(ComponentTesting.newPrivateProjectDto(organizationDto).setDbKey("another_project")); + ComponentDto anotherProject = componentDb.insertPrivateProject(organizationDto, c -> c.setDbKey("another_project")); componentDb.insertComponent(newModuleDto(anotherProject).setDbKey("my_new_project:module_1")); ComponentDto module2 = componentDb.insertComponent(newModuleDto(project).setDbKey("my_project:module_2")); componentDb.insertComponent(newFileDto(module2, null)); @@ -129,7 +128,7 @@ public class BulkUpdateKeyActionTest { tuple(project.getDbKey(), "your_project", false), tuple(module.getDbKey(), "your_project:root:module", false)); - verify(componentService).bulkUpdateKey(any(DbSession.class), eq(project), eq(FROM), eq(TO)); + verify(componentService).bulkUpdateKey(any(DbSession.class), eq(componentDb.getProjectDto(project)), eq(FROM), eq(TO)); } @Test @@ -139,25 +138,25 @@ public class BulkUpdateKeyActionTest { callByKey(provisionedProject.getDbKey(), provisionedProject.getDbKey(), newKey); - verify(componentService).bulkUpdateKey(any(DbSession.class), eq(provisionedProject), eq(provisionedProject.getDbKey()), eq(newKey)); + verify(componentService).bulkUpdateKey(any(DbSession.class), eq(componentDb.getProjectDto(provisionedProject)), eq(provisionedProject.getDbKey()), eq(newKey)); } @Test public void fail_to_bulk_update_key_using_branch_db_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto branch = db.components().insertProjectBranch(project); userSession.addProjectPermission(UserRole.USER, project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(String.format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(String.format("Project '%s' not found", branch.getDbKey())); callByKey(branch.getDbKey(), FROM, TO); } @Test public void fail_to_bulk_if_a_component_already_exists_with_the_same_key() { - componentDb.insertComponent(ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()).setDbKey("my_project")); - componentDb.insertComponent(ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()).setDbKey("your_project")); + componentDb.insertPrivateProject(db.getDefaultOrganization(), c -> c.setDbKey("my_project")); + componentDb.insertPrivateProject(db.getDefaultOrganization(), c -> c.setDbKey("your_project")); expectedException.expect(BadRequestException.class); expectedException.expectMessage("Impossible to update key: a component with key \"your_project\" already exists."); @@ -190,8 +189,8 @@ public class BulkUpdateKeyActionTest { ComponentDto project = insertMyProject(); ComponentDto file = componentDb.insertComponent(newFileDto(project, null)); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Component updated must be a module or a key"); + expectedException.expect(NotFoundException.class); + expectedException.expectMessage(String.format("Project '%s' not found", file.getDbKey())); callByKey(file.getDbKey(), FROM, TO); } @@ -239,13 +238,13 @@ public class BulkUpdateKeyActionTest { } @Test - public void fail_when_using_branch_db_key() throws Exception { - ComponentDto project = db.components().insertMainBranch(); + public void fail_when_using_branch_db_key() { + ComponentDto project = db.components().insertPrivateProject(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(String.format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(String.format("Project '%s' not found", branch.getDbKey())); callByKey(branch.getDbKey(), FROM, TO); } @@ -264,7 +263,7 @@ public class BulkUpdateKeyActionTest { } private ComponentDto insertMyProject() { - return componentDb.insertComponent(ComponentTesting.newPrivateProjectDto(db.organizations().insert()).setDbKey(MY_PROJECT_KEY)); + return componentDb.insertPublicProject(db.organizations().insert(), c -> c.setDbKey(MY_PROJECT_KEY)); } private BulkUpdateKeyWsResponse callDryRunByKey(@Nullable String key, @Nullable String from, @Nullable String to) { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java index 9056e21a582..038245dcf47 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/DeleteActionTest.java @@ -31,7 +31,7 @@ import org.sonar.db.DbSession; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; -import org.sonar.db.component.ResourceTypesRule; +import org.sonar.db.project.ProjectDto; import org.sonar.db.user.UserDto; import org.sonar.db.webhook.WebhookDbTester; import org.sonar.db.webhook.WebhookDto; @@ -52,7 +52,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.sonar.api.resources.Qualifiers.PROJECT; import static org.sonar.api.web.UserRole.ADMIN; import static org.sonar.db.permission.OrganizationPermission.ADMINISTER; import static org.sonar.db.user.UserTesting.newUserDto; @@ -60,9 +59,6 @@ import static org.sonar.server.component.TestComponentFinder.from; import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_PROJECT; public class DeleteActionTest { - - private static final String ACTION = "delete"; - private System2 system2 = System2.INSTANCE; @Rule @@ -115,8 +111,7 @@ public class DeleteActionTest { dbSession.commit(); userSessionRule.logIn().addProjectPermission(ADMIN, project); DeleteAction underTest = new DeleteAction( - new ComponentCleanerService(dbClient, new ResourceTypesRule().setAllQualifiers(PROJECT), - new TestProjectIndexers()), + new ComponentCleanerService(dbClient, new TestProjectIndexers()), from(db), dbClient, userSessionRule, projectLifeCycleListeners); new WsActionTester(underTest) @@ -131,7 +126,7 @@ public class DeleteActionTest { @Test public void project_deletion_also_ensure_that_webhooks_on_this_project_if_they_exists_are_deleted() { - ComponentDto project = componentDbTester.insertPrivateProject(); + ProjectDto project = componentDbTester.insertPrivateProjectDto(); webhookDbTester.insertWebhook(project); webhookDbTester.insertWebhook(project); webhookDbTester.insertWebhook(project); @@ -139,13 +134,12 @@ public class DeleteActionTest { userSessionRule.logIn().addProjectPermission(ADMIN, project); DeleteAction underTest = new DeleteAction( - new ComponentCleanerService(dbClient, new ResourceTypesRule().setAllQualifiers(PROJECT), - new TestProjectIndexers()), + new ComponentCleanerService(dbClient, new TestProjectIndexers()), from(db), dbClient, userSessionRule, projectLifeCycleListeners); new WsActionTester(underTest) .newRequest() - .setParam(PARAM_PROJECT, project.getDbKey()) + .setParam(PARAM_PROJECT, project.getKey()) .execute(); List<WebhookDto> webhookDtos = dbClient.webhookDao().selectByProject(dbSession, project); @@ -177,20 +171,20 @@ public class DeleteActionTest { @Test public void fail_when_using_branch_db_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSessionRule.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(String.format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(String.format("Project '%s' not found", branch.getDbKey())); call(tester.newRequest().setParam(PARAM_PROJECT, branch.getDbKey())); } private String verifyDeletedKey() { - ArgumentCaptor<ComponentDto> argument = ArgumentCaptor.forClass(ComponentDto.class); + ArgumentCaptor<ProjectDto> argument = ArgumentCaptor.forClass(ProjectDto.class); verify(componentCleanerService).delete(any(DbSession.class), argument.capture()); - return argument.getValue().getDbKey(); + return argument.getValue().getKey(); } private void call(TestRequest request) { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/SearchActionTest.java index 165c24bcb9c..5c950cf6161 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/SearchActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/SearchActionTest.java @@ -232,7 +232,7 @@ public class SearchActionTest { @Test public void does_not_return_branches_when_searching_by_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); userSession.addPermission(ADMINISTER, db.getDefaultOrganization()); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/SearchMyProjectsActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/SearchMyProjectsActionTest.java index 83c06e8ea24..0ce405da2a7 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/SearchMyProjectsActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/SearchMyProjectsActionTest.java @@ -196,7 +196,7 @@ public class SearchMyProjectsActionTest { @Test public void does_not_return_branches() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/UpdateKeyActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/UpdateKeyActionTest.java index d52f5a25326..5c758f2ffc5 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/UpdateKeyActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/UpdateKeyActionTest.java @@ -32,6 +32,7 @@ import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTesting; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.ComponentService; import org.sonar.server.es.ProjectIndexers; import org.sonar.server.es.ProjectIndexersImpl; @@ -58,35 +59,21 @@ public class UpdateKeyActionTest { private DbClient dbClient = db.getDbClient(); private ProjectIndexers projectIndexers = new ProjectIndexersImpl(); private ComponentService componentService = new ComponentService(dbClient, userSessionRule, projectIndexers, new ProjectLifeCycleListenersImpl()); - private WsActionTester ws = new WsActionTester(new UpdateKeyAction(dbClient, componentService)); + private ComponentFinder componentFinder = new ComponentFinder(dbClient, null); + private WsActionTester ws = new WsActionTester(new UpdateKeyAction(dbClient, componentService, componentFinder)); @Test public void update_key_of_project_referenced_by_its_key() { ComponentDto project = insertProject(); userSessionRule.addProjectPermission(UserRole.ADMIN, project); - call(project.getKey(), ANOTHER_KEY); + call(project.getDbKey(), ANOTHER_KEY); - assertThat(selectByKey(project.getKey()).isPresent()).isFalse(); + assertThat(selectByKey(project.getDbKey()).isPresent()).isFalse(); assertThat(selectByKey(ANOTHER_KEY).get().uuid()).isEqualTo(project.uuid()); } @Test - public void update_key_of_disabled_module() { - ComponentDto project = insertProject(); - ComponentDto module = db.components().insertComponent(ComponentTesting.newModuleDto(project).setEnabled(false)); - userSessionRule.addProjectPermission(UserRole.ADMIN, project); - - call(module.getKey(), ANOTHER_KEY); - - assertThat(selectByKey(project.getKey()).isPresent()).isTrue(); - assertThat(selectByKey(module.getKey()).isPresent()).isFalse(); - ComponentDto loadedModule = selectByKey(ANOTHER_KEY).get(); - assertThat(loadedModule.uuid()).isEqualTo(module.uuid()); - assertThat(loadedModule.isEnabled()).isFalse(); - } - - @Test public void fail_if_not_authorized() { ComponentDto project = insertProject(); userSessionRule.addProjectPermission(UserRole.USER, project); @@ -125,12 +112,12 @@ public class UpdateKeyActionTest { @Test public void fail_when_using_branch_db_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); userSessionRule.addProjectPermission(UserRole.ADMIN, project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component not found"); + expectedException.expectMessage(String.format("Project '%s' not found", branch.getDbKey())); call(branch.getDbKey(), ANOTHER_KEY); } @@ -150,7 +137,7 @@ public class UpdateKeyActionTest { } private ComponentDto insertProject() { - return db.components().insertComponent(ComponentTesting.newPrivateProjectDto(db.organizations().insert())); + return db.components().insertPrivateProject(db.organizations().insert()); } private String call(@Nullable String key, @Nullable String newKey) { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/UpdateVisibilityActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/UpdateVisibilityActionTest.java index 302ab99c787..7a0a3a67b67 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/UpdateVisibilityActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/project/ws/UpdateVisibilityActionTest.java @@ -312,7 +312,7 @@ public class UpdateVisibilityActionTest { BranchDto branchDto = ComponentTesting.newBranchDto(project); dbClient.branchDao().insert(dbSession, branchDto); - ComponentDto branch = ComponentTesting.newProjectBranch(project, branchDto); + ComponentDto branch = ComponentTesting.newBranchComponent(project, branchDto); ComponentDto module = ComponentTesting.newModuleDto(project); ComponentDto dir = ComponentTesting.newDirectory(project, "path"); ComponentDto file = ComponentTesting.newFileDto(project); @@ -339,7 +339,7 @@ public class UpdateVisibilityActionTest { BranchDto branchDto = ComponentTesting.newBranchDto(project); dbClient.branchDao().insert(dbSession, branchDto); - ComponentDto branch = ComponentTesting.newProjectBranch(project, branchDto) + ComponentDto branch = ComponentTesting.newBranchComponent(project, branchDto) .setPrivate(initiallyPrivate); ComponentDto module = ComponentTesting.newModuleDto(project) .setPrivate(initiallyPrivate); @@ -626,7 +626,7 @@ public class UpdateVisibilityActionTest { @Test public void fail_when_using_branch_db_key() { - ComponentDto project = dbTester.components().insertMainBranch(); + ComponentDto project = dbTester.components().insertPrivateProject(); userSessionRule.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = dbTester.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/CreateEventActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/CreateEventActionTest.java index db8e80468e2..b7a294410cf 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/CreateEventActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/CreateEventActionTest.java @@ -180,8 +180,8 @@ public class CreateEventActionTest { @Test public void create_event_on_application() { - ComponentDto application = ComponentTesting.newApplication(db.getDefaultOrganization()); - SnapshotDto analysis = db.components().insertProjectAndSnapshot(application); + ComponentDto application = db.components().insertPublicApplication(db.getDefaultOrganization()); + SnapshotDto analysis = db.components().insertSnapshot(application); logInAsProjectAdministrator(application); CreateEventResponse result = call(OTHER.name(), "Application Event", analysis.getUuid()); @@ -268,21 +268,9 @@ public class CreateEventActionTest { } @Test - public void fail_if_create_on_view() { - ComponentDto view = newView(db.organizations().insert()); - SnapshotDto analysis = db.components().insertViewAndSnapshot(view); - logInAsProjectAdministrator(view); - - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("An event must be created on a project or an application"); - - call(OTHER.name(), "View Event", analysis.getUuid()); - } - - @Test public void fail_if_create_version_event_on_application() { - ComponentDto application = newApplication(db.organizations().insert()); - SnapshotDto analysis = db.components().insertViewAndSnapshot(application); + ComponentDto application = db.components().insertPrivateApplication(db.getDefaultOrganization()); + SnapshotDto analysis = db.components().insertSnapshot(application); logInAsProjectAdministrator(application); expectedException.expect(IllegalArgumentException.class); 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 c5d81e80ee6..d8dee1487fc 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 @@ -101,11 +101,9 @@ public class DeleteActionTest { String analysisUuid = RandomStringUtils.randomAlphabetic(12); ComponentDto project = db.components().insertPrivateProject(); SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project).setUuid(analysisUuid).setLast(false)); - BranchDto branch = newBranchDto(project, BRANCH); - db.getDbClient().branchDao().insert(db.getSession(), branch); db.newCodePeriods().insert(new NewCodePeriodDto() .setProjectUuid(project.uuid()) - .setBranchUuid(branch.getUuid()) + .setBranchUuid(project.uuid()) .setType(NewCodePeriodType.SPECIFIC_ANALYSIS) .setValue(analysis.getUuid())); db.commit(); 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 11467671867..2a5edaaa908 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 @@ -37,8 +37,9 @@ 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.BranchDao; import org.sonar.db.component.BranchDto; -import org.sonar.db.component.BranchType; +import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTesting; import org.sonar.db.component.SnapshotDto; @@ -71,26 +72,20 @@ public class SetBaselineActionTest { public DbTester db = DbTester.create(System2.INSTANCE); private DbClient dbClient = db.getDbClient(); private DbSession dbSession = db.getSession(); - - private WsActionTester ws = new WsActionTester(new SetBaselineAction(dbClient, userSession, TestComponentFinder.from(db))); + private BranchDao branchDao = db.getDbClient().branchDao(); + private ComponentDbTester tester = new ComponentDbTester(db); + private WsActionTester ws = new WsActionTester(new SetBaselineAction(dbClient, userSession, TestComponentFinder.from(db), branchDao)); @Test @UseDataProvider("nullOrEmpty") public void set_baseline_on_main_branch(@Nullable String branchName) { - ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - BranchDto branch = new BranchDto() - .setBranchType(BranchType.BRANCH) - .setProjectUuid(project.uuid()) - .setUuid(project.uuid()) - .setKey("master"); - db.components().insertComponent(project); - db.getDbClient().branchDao().insert(dbSession, branch); + ComponentDto project = tester.insertPrivateProject(); SnapshotDto analysis = db.components().insertSnapshot(project); logInAsProjectAdministrator(project); call(project.getKey(), branchName, analysis.getUuid()); - NewCodePeriodDto loaded = dbClient.newCodePeriodDao().selectByBranch(dbSession, project.uuid(), branch.getUuid()).get(); + NewCodePeriodDto loaded = dbClient.newCodePeriodDao().selectByBranch(dbSession, project.uuid(), project.uuid()).get(); assertThat(loaded.getValue()).isEqualTo(analysis.getUuid()); assertThat(loaded.getType()).isEqualTo(SPECIFIC_ANALYSIS); } @@ -106,11 +101,10 @@ public class SetBaselineActionTest { @Test public void set_baseline_on_non_main_branch() { - ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - BranchDto branch = ComponentTesting.newBranchDto(project.projectUuid(), BranchType.BRANCH); - db.components().insertProjectBranch(project, branch); - ComponentDto branchComponentDto = ComponentTesting.newProjectBranch(project, branch); - SnapshotDto analysis = db.components().insertSnapshot(branchComponentDto); + ComponentDto project = tester.insertPrivateProject(); + ComponentDto branchComponent = tester.insertProjectBranch(project); + SnapshotDto analysis = db.components().insertSnapshot(branchComponent); + BranchDto branch = branchDao.selectByUuid(dbSession, branchComponent.uuid()).get(); logInAsProjectAdministrator(project); call(project.getKey(), branch.getKey(), analysis.getUuid()); @@ -122,16 +116,13 @@ public class SetBaselineActionTest { @Test public void fail_when_user_is_not_admin() { - ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - BranchDto branch = ComponentTesting.newBranchDto(project.projectUuid(), BranchType.BRANCH); - db.components().insertProjectBranch(project, branch); - ComponentDto branchComponentDto = ComponentTesting.newProjectBranch(project, branch); - SnapshotDto analysis = db.components().insertSnapshot(branchComponentDto); + ComponentDto project = tester.insertPrivateProject(); + SnapshotDto analysis = db.components().insertSnapshot(project); expectedException.expect(ForbiddenException.class); expectedException.expectMessage("Insufficient privileges"); - call(project.getKey(), branch.getKey(), analysis.getUuid()); + call(project.getKey(), "master", analysis.getUuid()); } @Test @@ -161,16 +152,13 @@ public class SetBaselineActionTest { @Test @UseDataProvider("nonexistentParamsAndFailureMessage") public void fail_with_IAE_when_required_param_nonexistent(Map<String, String> nonexistentParams, String regex) { - ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - BranchDto branch = ComponentTesting.newBranchDto(project.projectUuid(), BranchType.BRANCH); - db.components().insertProjectBranch(project, branch); - ComponentDto branchComponentDto = ComponentTesting.newProjectBranch(project, branch); - SnapshotDto analysis = db.components().insertSnapshot(branchComponentDto); + ComponentDto project = tester.insertPrivateProject(); + SnapshotDto analysis = db.components().insertSnapshot(project); logInAsProjectAdministrator(project); Map<String, String> params = new HashMap<>(); params.put(PARAM_PROJECT, project.getKey()); - params.put(PARAM_BRANCH, branch.getKey()); + params.put(PARAM_BRANCH, "master"); params.put(PARAM_ANALYSIS, analysis.getUuid()); params.putAll(nonexistentParams); @@ -185,59 +173,46 @@ public class SetBaselineActionTest { MapBuilder builder = new MapBuilder(); 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_PROJECT, "nonexistent").map, "Project 'nonexistent' not found"}, + {builder.put(PARAM_BRANCH, "nonexistent").map, "Branch 'nonexistent' in project .* not found"}, {builder.put(PARAM_ANALYSIS, "nonexistent").map, "Analysis 'nonexistent' is not found"}, }; } @Test public void fail_when_branch_does_not_belong_to_project() { - ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - BranchDto branch = ComponentTesting.newBranchDto(project.projectUuid(), BranchType.BRANCH); - db.components().insertProjectBranch(project, branch); - ComponentDto branchComponentDto = ComponentTesting.newProjectBranch(project, branch); - SnapshotDto analysis = db.components().insertSnapshot(branchComponentDto); + ComponentDto project = tester.insertPrivateProject(); + SnapshotDto analysis = db.components().insertSnapshot(project); logInAsProjectAdministrator(project); - ComponentDto otherProject = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - BranchDto otherBranch = ComponentTesting.newBranchDto(otherProject.projectUuid(), BranchType.BRANCH); - db.components().insertProjectBranch(otherProject, otherBranch); - ComponentTesting.newProjectBranch(otherProject, otherBranch); + ComponentDto otherProject = tester.insertPrivateProjectWithCustomBranch(db.getDefaultOrganization(), branch -> branch.setKey("main")); + BranchDto branchOfOtherProject = branchDao.selectByUuid(dbSession, otherProject.uuid()).get(); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(String.format("Component '%s' on branch '%s' not found", project.getKey(), otherBranch.getKey())); + expectedException.expectMessage(String.format("Branch '%s' in project '%s' not found", branchOfOtherProject.getKey(), project.getKey())); - call(project.getKey(), otherBranch.getKey(), analysis.getUuid()); + call(project.getKey(), branchOfOtherProject.getKey(), analysis.getUuid()); } @Test public void fail_when_analysis_does_not_belong_to_main_branch_of_project() { - ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - BranchDto branch = new BranchDto() - .setBranchType(BranchType.BRANCH) - .setProjectUuid(project.uuid()) - .setUuid(project.uuid()) - .setKey("master"); - db.components().insertComponent(project); - db.getDbClient().branchDao().insert(dbSession, branch); + ComponentDto project = tester.insertPrivateProjectWithCustomBranch(db.getDefaultOrganization(), b -> b.setKey("branch1")); logInAsProjectAdministrator(project); ComponentDto otherProject = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - SnapshotDto otherAnalysis = db.components().insertSnapshot(otherProject); + SnapshotDto otherAnalysis = db.components().insertProjectAndSnapshot(otherProject); expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage(String.format("Analysis '%s' does not belong to project '%s'", - otherAnalysis.getUuid(), project.getKey())); + expectedException.expectMessage(String.format("Analysis '%s' does not belong to branch '%s' of project '%s'", + otherAnalysis.getUuid(), "branch1", project.getKey())); - call(ImmutableMap.of(PARAM_PROJECT, project.getKey(), PARAM_ANALYSIS, otherAnalysis.getUuid())); + call(project.getKey(), "branch1", otherAnalysis.getUuid()); } @Test public void fail_when_analysis_does_not_belong_to_non_main_branch_of_project() { - ComponentDto project = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); - BranchDto branch = ComponentTesting.newBranchDto(project.projectUuid(), BranchType.BRANCH); - db.components().insertProjectBranch(project, branch); + ComponentDto project = tester.insertPrivateProject(); + tester.insertProjectBranch(project, b -> b.setKey("branch1")); logInAsProjectAdministrator(project); ComponentDto otherProject = ComponentTesting.newPrivateProjectDto(db.organizations().insert()); @@ -245,9 +220,9 @@ public class SetBaselineActionTest { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage(String.format("Analysis '%s' does not belong to branch '%s' of project '%s'", - otherAnalysis.getUuid(), branch.getKey(), project.getKey())); + otherAnalysis.getUuid(), "branch1", project.getKey())); - call(project.getKey(), branch.getKey(), otherAnalysis.getUuid()); + call(project.getKey(), "branch1", otherAnalysis.getUuid()); } @Test diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/UnsetBaselineActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/UnsetBaselineActionTest.java index 15679f91ecb..09f714b9bdd 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/UnsetBaselineActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectanalysis/ws/UnsetBaselineActionTest.java @@ -35,6 +35,7 @@ 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.BranchDao; import org.sonar.db.component.BranchDto; import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDto; @@ -52,9 +53,6 @@ import org.sonar.server.ws.WsActionTester; import static java.util.Optional.ofNullable; import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; import static org.assertj.core.api.Assertions.assertThat; -import static org.sonar.db.component.ComponentTesting.newBranchDto; -import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto; -import static org.sonar.db.component.ComponentTesting.newProjectBranch; import static org.sonar.server.projectanalysis.ws.ProjectAnalysesWsParameters.PARAM_BRANCH; import static org.sonar.server.projectanalysis.ws.ProjectAnalysesWsParameters.PARAM_PROJECT; import static org.sonarqube.ws.client.WsRequest.Method.POST; @@ -70,14 +68,15 @@ public class UnsetBaselineActionTest { @Rule public DbTester db = DbTester.create(System2.INSTANCE); + private DbClient dbClient = db.getDbClient(); private DbSession dbSession = db.getSession(); - - private WsActionTester ws = new WsActionTester(new UnsetBaselineAction(dbClient, userSession, TestComponentFinder.from(db))); + private BranchDao branchDao = db.getDbClient().branchDao(); + private WsActionTester ws = new WsActionTester(new UnsetBaselineAction(dbClient, userSession, TestComponentFinder.from(db), branchDao)); @Test public void does_not_fail_and_has_no_effect_when_there_is_no_baseline_on_main_branch() { - ComponentDto project = db.components().insertMainBranch(db.organizations().insert()); + ComponentDto project = db.components().insertPublicProject(db.organizations().insert()); ComponentDto branch = db.components().insertProjectBranch(project); SnapshotDto analysis = db.components().insertSnapshot(project); logInAsProjectAdministrator(project); @@ -89,7 +88,7 @@ public class UnsetBaselineActionTest { @Test public void does_not_fail_and_has_no_effect_when_there_is_no_baseline_on_non_main_branch() { - ComponentDto project = db.components().insertMainBranch(db.organizations().insert()); + ComponentDto project = db.components().insertPublicProject(db.organizations().insert()); ComponentDto branch = db.components().insertProjectBranch(project); SnapshotDto analysis = db.components().insertSnapshot(project); logInAsProjectAdministrator(project); @@ -101,7 +100,7 @@ public class UnsetBaselineActionTest { @Test public void unset_baseline_when_it_is_set_on_main_branch() { - ComponentDto project = db.components().insertMainBranch(db.organizations().insert()); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); SnapshotDto projectAnalysis = db.components().insertSnapshot(project); SnapshotDto branchAnalysis = db.components().insertSnapshot(project); @@ -115,7 +114,7 @@ public class UnsetBaselineActionTest { @Test public void unset_baseline_when_it_is_set_non_main_branch() { - ComponentDto project = db.components().insertMainBranch(db.organizations().insert()); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); db.components().insertSnapshot(branch); SnapshotDto branchAnalysis = db.components().insertSnapshot(project); @@ -130,7 +129,7 @@ public class UnsetBaselineActionTest { @Test public void fail_when_user_is_not_admin_on_project() { - ComponentDto project = db.components().insertMainBranch(db.organizations().insert()); + ComponentDto project = db.components().insertPublicProject(); db.components().insertProjectBranch(project); expectedException.expect(ForbiddenException.class); @@ -141,7 +140,7 @@ public class UnsetBaselineActionTest { @Test public void fail_when_user_is_not_admin_on_project_of_branch() { - ComponentDto project = db.components().insertMainBranch(db.organizations().insert()); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(ForbiddenException.class); @@ -153,7 +152,7 @@ public class UnsetBaselineActionTest { @Test @UseDataProvider("nullOrEmptyOrValue") public void fail_with_IAE_when_missing_project_parameter(@Nullable String branchParam) { - ComponentDto project = db.components().insertMainBranch(db.organizations().insert()); + ComponentDto project = db.components().insertPublicProject(); db.components().insertProjectBranch(project); logInAsProjectAdministrator(project); @@ -166,7 +165,7 @@ public class UnsetBaselineActionTest { @Test @UseDataProvider("nullOrEmptyOrValue") public void fail_with_IAE_when_project_parameter_empty(@Nullable String branchParam) { - ComponentDto project = db.components().insertMainBranch(db.organizations().insert()); + ComponentDto project = db.components().insertPublicProject(); db.components().insertProjectBranch(project); logInAsProjectAdministrator(project); @@ -188,7 +187,7 @@ public class UnsetBaselineActionTest { @Test @UseDataProvider("nullOrEmpty") public void does_not_fail_with_IAE_when_missing_branch_parameter(@Nullable String branchParam) { - ComponentDto project = db.components().insertMainBranch(db.organizations().insert()); + ComponentDto project = db.components().insertPublicProject(); db.components().insertProjectBranch(project); logInAsProjectAdministrator(project); @@ -214,28 +213,26 @@ public class UnsetBaselineActionTest { @Test public void fail_when_branch_does_not_belong_to_project() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); ComponentDto branch = db.components().insertProjectBranch(project); - ComponentDto otherProject = db.components().insertMainBranch(organization); + ComponentDto otherProject = db.components().insertPublicProject(organization); ComponentDto otherBranch = db.components().insertProjectBranch(otherProject); logInAsProjectAdministrator(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(String.format("Component '%s' on branch '%s' not found", project.getKey(), otherBranch.getKey())); + expectedException.expectMessage(String.format("Branch '%s' in project '%s' not found", otherBranch.getKey(), project.getKey())); call(project.getKey(), otherBranch.getKey()); } @Test public void fail_with_NotFoundException_when_branch_is_pull_request() { - ComponentDto project = newPrivateProjectDto(db.organizations().insert()); - BranchDto branch = newBranchDto(project.projectUuid(), BranchType.BRANCH); - db.components().insertProjectBranch(project, branch); - ComponentDto pullRequest = newProjectBranch(project, branch); + ComponentDto project = db.components().insertPrivateProject(); + ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.PULL_REQUEST)); logInAsProjectAdministrator(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(String.format("Component '%s' on branch '%s' not found", project.getKey(), pullRequest.getKey())); + expectedException.expectMessage(String.format("Branch '%s' in project '%s' not found", pullRequest.getKey(), project.getKey())); call(project.getKey(), pullRequest.getKey()); } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectlink/ws/CreateActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectlink/ws/CreateActionTest.java index c3c69300254..875ae65f6d8 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectlink/ws/CreateActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectlink/ws/CreateActionTest.java @@ -19,7 +19,6 @@ */ package org.sonar.server.projectlink.ws; -import java.util.Random; import org.apache.commons.lang.StringUtils; import org.junit.Rule; import org.junit.Test; @@ -36,7 +35,6 @@ import org.sonar.db.component.ComponentTesting; import org.sonar.db.component.ProjectLinkDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.server.component.TestComponentFinder; -import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.tester.UserSessionRule; @@ -196,38 +194,43 @@ public class CreateActionTest { public void fail_if_module() { ComponentDto project = db.components().insertPrivateProject(); ComponentDto module = db.components().insertComponent(ComponentTesting.newModuleDto(project)); - failIfNotAProject(project, module); + failIfNotAProjectWithKey(project, module); + failIfNotAProjectWithUuid(project, module); } @Test public void fail_if_directory() { ComponentDto project = db.components().insertPrivateProject(); ComponentDto directory = db.components().insertComponent(ComponentTesting.newDirectory(project, "A/B")); - failIfNotAProject(project, directory); + failIfNotAProjectWithKey(project, directory); + failIfNotAProjectWithUuid(project, directory); } @Test public void fail_if_file() { ComponentDto project = db.components().insertPrivateProject(); ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(project)); - failIfNotAProject(project, file); + failIfNotAProjectWithKey(project, file); + failIfNotAProjectWithUuid(project, file); } @Test public void fail_if_view() { ComponentDto view = db.components().insertView(); - failIfNotAProject(view, view); + failIfNotAProjectWithKey(view, view); + failIfNotAProjectWithUuid(view, view); + } @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); ws.newRequest() .setParam(PARAM_PROJECT_KEY, branch.getDbKey()) @@ -239,12 +242,12 @@ public class CreateActionTest { @Test public void fail_when_using_branch_db_uuid() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component id '%s' not found", branch.uuid())); + expectedException.expectMessage(format("Project '%s' not found", branch.uuid())); ws.newRequest() .setParam(PARAM_PROJECT_ID, branch.uuid()) @@ -263,18 +266,28 @@ public class CreateActionTest { assertThat(action.params()).hasSize(4); } - private void failIfNotAProject(ComponentDto root, ComponentDto component) { + private void failIfNotAProjectWithKey(ComponentDto root, ComponentDto component) { userSession.logIn().addProjectPermission(UserRole.ADMIN, root); - expectedException.expect(BadRequestException.class); - expectedException.expectMessage("Component '" + component.getDbKey() + "' must be a project"); + expectedException.expect(NotFoundException.class); + expectedException.expectMessage("Project '" + component.getDbKey() + "' not found"); + + TestRequest testRequest = ws.newRequest(); + testRequest.setParam(PARAM_PROJECT_KEY, component.getDbKey()); + testRequest + .setParam(PARAM_NAME, "Custom") + .setParam(PARAM_URL, "http://example.org") + .execute(); + } + + private void failIfNotAProjectWithUuid(ComponentDto root, ComponentDto component) { + userSession.logIn().addProjectPermission(UserRole.ADMIN, root); + + expectedException.expect(NotFoundException.class); + expectedException.expectMessage("Project '" + component.uuid() + "' not found"); TestRequest testRequest = ws.newRequest(); - if (new Random().nextBoolean()) { - testRequest.setParam(PARAM_PROJECT_KEY, component.getDbKey()); - } else { - testRequest.setParam(PARAM_PROJECT_ID, component.uuid()); - } + testRequest.setParam(PARAM_PROJECT_ID, component.uuid()); testRequest .setParam(PARAM_NAME, "Custom") .setParam(PARAM_URL, "http://example.org") diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectlink/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectlink/ws/SearchActionTest.java index 5a8a1b20156..dd56d650760 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectlink/ws/SearchActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projectlink/ws/SearchActionTest.java @@ -19,7 +19,6 @@ */ package org.sonar.server.projectlink.ws; -import java.util.Random; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -33,7 +32,6 @@ import org.sonar.db.component.ComponentTesting; import org.sonar.db.component.ProjectLinkDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.server.component.TestComponentFinder; -import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.tester.UserSessionRule; @@ -181,27 +179,31 @@ public class SearchActionTest { public void fail_if_module() { ComponentDto project = db.components().insertPrivateProject(); ComponentDto module = db.components().insertComponent(ComponentTesting.newModuleDto(project)); - failIfNotAProject(project, module); + failIfNotAProjectWithKey(project, module); + failIfNotAProjectWithUuid(project, module); } @Test public void fail_if_directory() { ComponentDto project = db.components().insertPrivateProject(); ComponentDto directory = db.components().insertComponent(ComponentTesting.newDirectory(project, "A/B")); - failIfNotAProject(project, directory); + failIfNotAProjectWithKey(project, directory); + failIfNotAProjectWithUuid(project, directory); } @Test public void fail_if_file() { ComponentDto project = db.components().insertPrivateProject(); ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(project)); - failIfNotAProject(project, file); + failIfNotAProjectWithKey(project, file); + failIfNotAProjectWithUuid(project, file); } @Test public void fail_if_view() { ComponentDto view = db.components().insertView(); - failIfNotAProject(view, view); + failIfNotAProjectWithKey(view, view); + failIfNotAProjectWithUuid(view, view); } @Test @@ -240,12 +242,12 @@ public class SearchActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); ws.newRequest() .setParam(PARAM_PROJECT_KEY, branch.getDbKey()) @@ -255,12 +257,12 @@ public class SearchActionTest { @Test public void fail_when_using_branch_db_uuid() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component id '%s' not found", branch.uuid())); + expectedException.expectMessage(format("Project '%s' not found", branch.uuid())); ws.newRequest() .setParam(PARAM_PROJECT_ID, branch.uuid()) @@ -293,18 +295,25 @@ public class SearchActionTest { userSession.logIn().addProjectPermission(UserRole.ADMIN, project); } - private void failIfNotAProject(ComponentDto root, ComponentDto component) { + private void failIfNotAProjectWithKey(ComponentDto root, ComponentDto component) { userSession.logIn().addProjectPermission(UserRole.ADMIN, root); - expectedException.expect(BadRequestException.class); - expectedException.expectMessage("Component '" + component.getKey() + "' must be a project"); + expectedException.expect(NotFoundException.class); + expectedException.expectMessage("Project '" + component.getKey() + "' not found"); + + TestRequest testRequest = ws.newRequest(); + testRequest.setParam(PARAM_PROJECT_KEY, component.getDbKey()); + testRequest.execute(); + } + + private void failIfNotAProjectWithUuid(ComponentDto root, ComponentDto component) { + userSession.logIn().addProjectPermission(UserRole.ADMIN, root); + + expectedException.expect(NotFoundException.class); + expectedException.expectMessage("Project '" + component.uuid() + "' not found"); TestRequest testRequest = ws.newRequest(); - if (new Random().nextBoolean()) { - testRequest.setParam(PARAM_PROJECT_KEY, component.getDbKey()); - } else { - testRequest.setParam(PARAM_PROJECT_ID, component.uuid()); - } + testRequest.setParam(PARAM_PROJECT_ID, component.uuid()); testRequest.execute(); } } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projecttag/ws/SetActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projecttag/ws/SetActionTest.java index 501651f0321..ce6a8eacc56 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projecttag/ws/SetActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/projecttag/ws/SetActionTest.java @@ -25,12 +25,14 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.api.server.ws.WebService; +import org.sonar.api.utils.System2; 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.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.server.component.TestComponentFinder; import org.sonar.server.es.TestProjectIndexers; import org.sonar.server.exceptions.BadRequestException; @@ -58,22 +60,22 @@ public class SetActionTest { private DbClient dbClient = db.getDbClient(); private DbSession dbSession = db.getSession(); - private ComponentDto project; + private ProjectDto project; private TestProjectIndexers projectIndexers = new TestProjectIndexers(); - private WsActionTester ws = new WsActionTester(new SetAction(dbClient, TestComponentFinder.from(db), userSession, projectIndexers)); + private WsActionTester ws = new WsActionTester(new SetAction(dbClient, TestComponentFinder.from(db), userSession, projectIndexers, System2.INSTANCE)); @Before public void setUp() { - project = db.components().insertPrivateProject(); + project = db.components().insertPrivateProjectDto(); } @Test public void set_tags_exclude_empty_and_blank_values() { - TestResponse response = call(project.getDbKey(), "finance , offshore, platform, ,"); + TestResponse response = call(project.getKey(), "finance , offshore, platform, ,"); - assertTags(project.getDbKey(), "finance", "offshore", "platform"); + assertTags(project.getKey(), "finance", "offshore", "platform"); // FIXME verify(indexer).indexProject(project.uuid(), PROJECT_TAGS_UPDATE); assertThat(response.getStatus()).isEqualTo(HTTP_NO_CONTENT); @@ -81,36 +83,36 @@ public class SetActionTest { @Test public void reset_tags() { - project = db.components().insertPrivateProject(p -> p.setTagsString("platform,scanner")); + project = db.components().insertPrivateProjectDto(p -> p.setTagsString("platform,scanner")); - call(project.getDbKey(), ""); + call(project.getKey(), ""); - assertNoTags(project.getDbKey()); + assertNoTags(project.getKey()); } @Test public void override_existing_tags() { - project = db.components().insertPrivateProject(p -> p.setTagsString("marketing,languages")); + project = db.components().insertPrivateProjectDto(p -> p.setTagsString("marketing,languages")); - call(project.getDbKey(), "finance,offshore,platform"); + call(project.getKey(), "finance,offshore,platform"); - assertTags(project.getDbKey(), "finance", "offshore", "platform"); + assertTags(project.getKey(), "finance", "offshore", "platform"); } @Test public void set_tags_as_project_admin() { userSession.logIn().addProjectPermission(UserRole.ADMIN, project); - call(project.getDbKey(), "platform, lambda"); + call(project.getKey(), "platform, lambda"); - assertTags(project.getDbKey(), "platform", "lambda"); + assertTags(project.getKey(), "platform", "lambda"); } @Test public void do_not_duplicate_tags() { - call(project.getDbKey(), "atlas, atlas, atlas"); + call(project.getKey(), "atlas, atlas, atlas"); - assertTags(project.getDbKey(), "atlas"); + assertTags(project.getKey(), "atlas"); } @Test @@ -118,7 +120,7 @@ public class SetActionTest { expectedException.expect(BadRequestException.class); expectedException.expectMessage("_finance_' is invalid. Project tags accept only the characters: a-z, 0-9, '+', '-', '#', '.'"); - call(project.getDbKey(), "_finance_"); + call(project.getKey(), "_finance_"); } @Test @@ -127,7 +129,7 @@ public class SetActionTest { expectedException.expect(ForbiddenException.class); - call(project.getDbKey(), "platform"); + call(project.getKey(), "platform"); } @Test @@ -141,48 +143,50 @@ public class SetActionTest { public void fail_if_no_tags() { expectedException.expect(IllegalArgumentException.class); - call(project.getDbKey(), null); + call(project.getKey(), null); } @Test public void fail_if_component_is_a_view() { ComponentDto view = db.components().insertView(v -> v.setDbKey("VIEW_KEY")); - expectedException.expect(BadRequestException.class); - expectedException.expectMessage("Component 'VIEW_KEY' is not a project"); + expectedException.expect(NotFoundException.class); + expectedException.expectMessage("Project 'VIEW_KEY' not found"); - call(view.getDbKey(), "point-of-view"); + call(view.getKey(), "point-of-view"); } @Test public void fail_if_component_is_a_module() { - ComponentDto module = db.components().insertComponent(newModuleDto(project).setDbKey("MODULE_KEY")); + ComponentDto projectComponent = dbClient.componentDao().selectByUuid(dbSession, project.getUuid()).get(); + ComponentDto module = db.components().insertComponent(newModuleDto(projectComponent).setDbKey("MODULE_KEY")); - expectedException.expect(BadRequestException.class); - expectedException.expectMessage("Component 'MODULE_KEY' is not a project"); + expectedException.expect(NotFoundException.class); + expectedException.expectMessage("Project 'MODULE_KEY' not found"); - call(module.getDbKey(), "modz"); + call(module.getKey(), "modz"); } @Test public void fail_if_component_is_a_file() { - ComponentDto file = db.components().insertComponent(newFileDto(project).setDbKey("FILE_KEY")); + ComponentDto projectComponent = dbClient.componentDao().selectByUuid(dbSession, project.getUuid()).get(); + ComponentDto file = db.components().insertComponent(newFileDto(projectComponent).setDbKey("FILE_KEY")); - expectedException.expect(BadRequestException.class); - expectedException.expectMessage("Component 'FILE_KEY' is not a project"); + expectedException.expect(NotFoundException.class); + expectedException.expectMessage("Project 'FILE_KEY' not found"); - call(file.getDbKey(), "secret"); + call(file.getKey(), "secret"); } @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); call(branch.getDbKey(), "secret"); } @@ -208,10 +212,10 @@ public class SetActionTest { } private void assertTags(String projectKey, String... tags) { - assertThat(dbClient.componentDao().selectOrFailByKey(dbSession, projectKey).getTags()).containsExactlyInAnyOrder(tags); + assertThat(dbClient.projectDao().selectProjectByKey(dbSession, projectKey).get().getTags()).containsExactlyInAnyOrder(tags); } private void assertNoTags(String projectKey) { - assertThat(dbClient.componentDao().selectOrFailByKey(dbSession, projectKey).getTags()).isEmpty(); + assertThat(dbClient.projectDao().selectProjectByKey(dbSession, projectKey).get().getTags()).isEmpty(); } } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CopyActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CopyActionTest.java index a8c073c1b84..d13937f0baa 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CopyActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CopyActionTest.java @@ -38,6 +38,7 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.organization.TestDefaultOrganizationProvider; @@ -73,7 +74,7 @@ public class CopyActionTest { private DbSession dbSession = db.getSession(); private TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); private QualityGateUpdater qualityGateUpdater = new QualityGateUpdater(dbClient, UuidFactoryFast.getInstance()); - private QualityGatesWsSupport wsSupport = new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider); + private QualityGatesWsSupport wsSupport = new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider, TestComponentFinder.from(db)); private CopyAction underTest = new CopyAction(dbClient, userSession, qualityGateUpdater, wsSupport); private WsActionTester ws = new WsActionTester(underTest); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CreateActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CreateActionTest.java index 566f77049e7..ea5fb77b074 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CreateActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CreateActionTest.java @@ -38,6 +38,7 @@ import org.sonar.db.organization.OrganizationDbTester; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.organization.TestDefaultOrganizationProvider; @@ -69,7 +70,7 @@ public class CreateActionTest { private DbClient dbClient = db.getDbClient(); private DbSession dbSession = db.getSession(); private CreateAction underTest = new CreateAction(dbClient, userSession, new QualityGateUpdater(dbClient, UuidFactoryFast.getInstance()), - new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider)); + new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider, TestComponentFinder.from(db))); private WsActionTester ws = new WsActionTester(underTest); @Test diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CreateConditionActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CreateConditionActionTest.java index 9a395b333d2..cb5f0c1514b 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CreateConditionActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/CreateConditionActionTest.java @@ -36,6 +36,7 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.organization.TestDefaultOrganizationProvider; @@ -71,7 +72,7 @@ public class CreateConditionActionTest { private DbClient dbClient = db.getDbClient(); private DbSession dbSession = db.getSession(); private CreateConditionAction underTest = new CreateConditionAction(dbClient, new QualityGateConditionsUpdater(dbClient), - new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider)); + new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider, TestComponentFinder.from(db))); private WsActionTester ws = new WsActionTester(underTest); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DeleteConditionActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DeleteConditionActionTest.java index 87f8d59e699..31ea34856af 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DeleteConditionActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DeleteConditionActionTest.java @@ -30,6 +30,7 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.organization.TestDefaultOrganizationProvider; @@ -59,7 +60,7 @@ public class DeleteConditionActionTest { private TestDefaultOrganizationProvider organizationProvider = TestDefaultOrganizationProvider.from(db); private WsActionTester ws = new WsActionTester( - new DeleteConditionAction(db.getDbClient(), new QualityGatesWsSupport(db.getDbClient(), userSession, organizationProvider))); + new DeleteConditionAction(db.getDbClient(), new QualityGatesWsSupport(db.getDbClient(), userSession, organizationProvider, TestComponentFinder.from(db)))); @Test public void definition() { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DeselectActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DeselectActionTest.java index 7085ba22a87..a52af6442d3 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DeselectActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DeselectActionTest.java @@ -30,8 +30,10 @@ import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; @@ -57,8 +59,8 @@ public class DeselectActionTest { private DbClient dbClient = db.getDbClient(); private TestDefaultOrganizationProvider organizationProvider = TestDefaultOrganizationProvider.from(db); - private DeselectAction underTest = new DeselectAction(dbClient, TestComponentFinder.from(db), - new QualityGatesWsSupport(db.getDbClient(), userSession, organizationProvider)); + private ComponentFinder componentFinder = TestComponentFinder.from(db); + private DeselectAction underTest = new DeselectAction(dbClient, new QualityGatesWsSupport(db.getDbClient(), userSession, organizationProvider, componentFinder)); private WsActionTester ws = new WsActionTester(underTest); @Test @@ -66,7 +68,7 @@ public class DeselectActionTest { OrganizationDto organization = db.organizations().insert(); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); associateProjectToQualityGate(project, qualityGate); ws.newRequest() @@ -78,42 +80,10 @@ public class DeselectActionTest { } @Test - public void deselect_by_uuid() { - OrganizationDto organization = db.organizations().insert(); - userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); - QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); - associateProjectToQualityGate(project, qualityGate); - - ws.newRequest() - .setParam("projectId", project.uuid()) - .setParam("organization", organization.getKey()) - .execute(); - - assertDeselected(project); - } - - @Test - public void deselect_by_id() { - OrganizationDto organization = db.organizations().insert(); - userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); - QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); - associateProjectToQualityGate(project, qualityGate); - - ws.newRequest() - .setParam("projectId", valueOf(project.getId())) - .setParam("organization", organization.getKey()) - .execute(); - - assertDeselected(project); - } - - @Test public void project_admin() { OrganizationDto organization = db.organizations().insert(); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); associateProjectToQualityGate(project, qualityGate); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); @@ -130,10 +100,10 @@ public class DeselectActionTest { OrganizationDto organization = db.organizations().insert(); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); associateProjectToQualityGate(project, qualityGate); // Another project - ComponentDto anotherProject = db.components().insertPrivateProject(organization); + ProjectDto anotherProject = db.components().insertPrivateProjectDto(organization); associateProjectToQualityGate(anotherProject, qualityGate); ws.newRequest() @@ -150,7 +120,7 @@ public class DeselectActionTest { OrganizationDto organization = db.getDefaultOrganization(); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); associateProjectToQualityGate(project, qualityGate); ws.newRequest() @@ -246,14 +216,14 @@ public class DeselectActionTest { } @Test - public void fail_when_using_branch_db_key() throws Exception { + public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); ws.newRequest() .setParam("projectKey", branch.getDbKey()) @@ -264,15 +234,15 @@ public class DeselectActionTest { @Test public void fail_when_using_branch_id() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component id '%s' not found", branch.uuid())); + expectedException.expectMessage(format("Project '%s' not found", branch.getId())); ws.newRequest() - .setParam("projectId", branch.uuid()) + .setParam("projectId", String.valueOf(branch.getId())) .setParam("organization", organization.getKey()) .execute(); } @@ -295,20 +265,20 @@ public class DeselectActionTest { tuple("organization", false)); } - private void associateProjectToQualityGate(ComponentDto project, QualityGateDto qualityGate) { + private void associateProjectToQualityGate(ProjectDto project, QualityGateDto qualityGate) { db.qualityGates().associateProjectToQualityGate(project, qualityGate); db.commit(); } - private void assertDeselected(ComponentDto project) { - Optional<String> qGateUuid = db.qualityGates().selectQGateUuidByComponentUuid(project.uuid()); + private void assertDeselected(ProjectDto project) { + Optional<String> qGateUuid = db.qualityGates().selectQGateUuidByComponentUuid(project.getUuid()); assertThat(qGateUuid) .isNotNull() .isEmpty(); } - private void assertSelected(QGateWithOrgDto qualityGate, ComponentDto project) { - Optional<String> qGateUuid = db.qualityGates().selectQGateUuidByComponentUuid(project.uuid()); + private void assertSelected(QGateWithOrgDto qualityGate, ProjectDto project) { + Optional<String> qGateUuid = db.qualityGates().selectQGateUuidByComponentUuid(project.getUuid()); assertThat(qGateUuid) .isNotNull() .isNotEmpty() diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DestroyActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DestroyActionTest.java index 9284567eb7b..9129c0c8ac3 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DestroyActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/DestroyActionTest.java @@ -28,10 +28,11 @@ import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.organization.TestDefaultOrganizationProvider; @@ -61,7 +62,7 @@ public class DestroyActionTest { private DbClient dbClient = db.getDbClient(); private TestDefaultOrganizationProvider organizationProvider = TestDefaultOrganizationProvider.from(db); private QualityGateFinder qualityGateFinder = new QualityGateFinder(dbClient); - private QualityGatesWsSupport wsSupport = new QualityGatesWsSupport(db.getDbClient(), userSession, organizationProvider); + private QualityGatesWsSupport wsSupport = new QualityGatesWsSupport(db.getDbClient(), userSession, organizationProvider, TestComponentFinder.from(db)); private DbSession dbSession = db.getSession(); private DestroyAction underTest = new DestroyAction(dbClient, wsSupport, qualityGateFinder); @@ -102,8 +103,8 @@ public class DestroyActionTest { OrganizationDto organization = db.organizations().insert(); db.qualityGates().createDefaultQualityGate(organization); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto prj1 = db.components().insertPublicProject(organization); - ComponentDto prj2 = db.components().insertPublicProject(organization); + ProjectDto prj1 = db.components().insertPublicProjectDto(organization); + ProjectDto prj2 = db.components().insertPublicProjectDto(organization); db.qualityGates().associateProjectToQualityGate(prj1, qualityGate); db.qualityGates().associateProjectToQualityGate(prj2, qualityGate); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); @@ -113,14 +114,14 @@ public class DestroyActionTest { .setParam(PARAM_ORGANIZATION, organization.getKey()) .execute(); - assertThat(db.getDbClient().projectQgateAssociationDao().selectQGateUuidByComponentUuid(dbSession, prj1.uuid())) + assertThat(db.getDbClient().projectQgateAssociationDao().selectQGateUuidByProjectUuid(dbSession, prj1.getUuid())) .isEmpty(); - assertThat(db.getDbClient().projectQgateAssociationDao().selectQGateUuidByComponentUuid(dbSession, prj2.uuid())) + assertThat(db.getDbClient().projectQgateAssociationDao().selectQGateUuidByProjectUuid(dbSession, prj2.getUuid())) .isEmpty(); - assertThat(db.getDbClient().projectQgateAssociationDao().selectQGateUuidByComponentUuid(dbSession, prj1.uuid())) + assertThat(db.getDbClient().projectQgateAssociationDao().selectQGateUuidByProjectUuid(dbSession, prj1.getUuid())) .isEmpty(); - assertThat(db.getDbClient().projectQgateAssociationDao().selectQGateUuidByComponentUuid(dbSession, prj2.uuid())) + assertThat(db.getDbClient().projectQgateAssociationDao().selectQGateUuidByProjectUuid(dbSession, prj2.getUuid())) .isEmpty(); } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/GetByProjectActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/GetByProjectActionTest.java index bf25785f0ed..fa5761cf847 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/GetByProjectActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/GetByProjectActionTest.java @@ -27,10 +27,10 @@ import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; 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.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.server.component.TestComponentFinder; @@ -57,11 +57,10 @@ public class GetByProjectActionTest { public DbTester db = DbTester.create(System2.INSTANCE); private DbClient dbClient = db.getDbClient(); - private DbSession dbSession = db.getSession(); private WsActionTester ws = new WsActionTester( new GetByProjectAction(userSession, dbClient, TestComponentFinder.from(db), new QualityGateFinder(dbClient), - new QualityGatesWsSupport(db.getDbClient(), userSession, TestDefaultOrganizationProvider.from(db)))); + new QualityGatesWsSupport(db.getDbClient(), userSession, TestDefaultOrganizationProvider.from(db), TestComponentFinder.from(db)))); @Test public void definition() { @@ -83,7 +82,7 @@ public class GetByProjectActionTest { @Test public void json_example() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization, qg -> qg.setName("My team QG")); db.qualityGates().associateProjectToQualityGate(project, qualityGate); logInAsProjectUser(project); @@ -102,7 +101,7 @@ public class GetByProjectActionTest { @Test public void default_quality_gate() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); QualityGateDto dbQualityGate = db.qualityGates().insertQualityGate(organization); db.qualityGates().setDefaultQualityGate(organization, dbQualityGate); logInAsProjectUser(project); @@ -121,7 +120,7 @@ public class GetByProjectActionTest { @Test public void project_quality_gate_over_default() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); QGateWithOrgDto defaultDbQualityGate = db.qualityGates().insertQualityGate(organization); db.qualityGates().setDefaultQualityGate(organization, defaultDbQualityGate); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization); @@ -141,7 +140,7 @@ public class GetByProjectActionTest { @Test public void get_by_project_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(db.getDefaultOrganization(), qg -> qg.setName("My team QG")); db.qualityGates().associateProjectToQualityGate(project, qualityGate); @@ -245,12 +244,12 @@ public class GetByProjectActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); ws.newRequest() .setParam("project", branch.getDbKey()) @@ -258,7 +257,7 @@ public class GetByProjectActionTest { .execute(); } - private void logInAsProjectUser(ComponentDto project) { + private void logInAsProjectUser(ProjectDto project) { userSession.logIn().addProjectPermission(UserRole.USER, project); } } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ListActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ListActionTest.java index 622e35852a9..077fd17200a 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ListActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ListActionTest.java @@ -30,6 +30,7 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.user.UserDto; +import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.organization.DefaultOrganizationProvider; import org.sonar.server.organization.TestDefaultOrganizationProvider; @@ -61,7 +62,7 @@ public class ListActionTest { private QualityGateFinder qualityGateFinder = new QualityGateFinder(dbClient); private WsActionTester ws = new WsActionTester(new ListAction(db.getDbClient(), - new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider), qualityGateFinder)); + new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider, TestComponentFinder.from(db)), qualityGateFinder)); @Test public void list_quality_gates() { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ProjectStatusActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ProjectStatusActionTest.java index 078089a85b7..dec0b7937e0 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ProjectStatusActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ProjectStatusActionTest.java @@ -413,13 +413,13 @@ public class ProjectStatusActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); SnapshotDto snapshot = db.components().insertSnapshot(branch); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); ws.newRequest() .setParam(PARAM_PROJECT_KEY, branch.getDbKey()) @@ -430,13 +430,13 @@ public class ProjectStatusActionTest { @Test public void fail_when_using_branch_uuid() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); SnapshotDto snapshot = db.components().insertSnapshot(branch); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Project id '%s' not found", branch.uuid())); + expectedException.expectMessage(format("Project '%s' not found", branch.uuid())); ws.newRequest() .setParam("projectId", branch.uuid()) diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/RenameActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/RenameActionTest.java index 948db30ef92..1452a1ca3d1 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/RenameActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/RenameActionTest.java @@ -27,6 +27,7 @@ import org.sonar.api.utils.System2; import org.sonar.db.DbTester; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualitygate.QGateWithOrgDto; +import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.organization.DefaultOrganizationProvider; @@ -53,7 +54,7 @@ public class RenameActionTest { private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); private WsActionTester ws = new WsActionTester( - new RenameAction(db.getDbClient(), new QualityGatesWsSupport(db.getDbClient(), userSession, defaultOrganizationProvider))); + new RenameAction(db.getDbClient(), new QualityGatesWsSupport(db.getDbClient(), userSession, defaultOrganizationProvider, TestComponentFinder.from(db)))); @Test public void verify_definition() { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/SearchActionTest.java index 967745b57cb..7b718f573f0 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/SearchActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/SearchActionTest.java @@ -27,8 +27,10 @@ import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.user.UserDto; +import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.organization.TestDefaultOrganizationProvider; import org.sonar.server.tester.UserSessionRule; @@ -66,7 +68,7 @@ public class SearchActionTest { private TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db); private SearchAction underTest = new SearchAction(dbClient, userSession, - new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider)); + new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider, TestComponentFinder.from(db))); private WsActionTester ws = new WsActionTester(underTest); @Test @@ -74,7 +76,7 @@ public class SearchActionTest { OrganizationDto organization = db.organizations().insert(); ComponentDto project = db.components().insertPublicProject(organization); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization); - db.qualityGates().associateProjectToQualityGate(project, qualityGate); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project), qualityGate); SearchResponse response = ws.newRequest() .setParam(PARAM_GATE_ID, valueOf(qualityGate.getId())) @@ -91,7 +93,7 @@ public class SearchActionTest { OrganizationDto defaultOrganization = db.getDefaultOrganization(); ComponentDto project = db.components().insertPublicProject(defaultOrganization); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(defaultOrganization); - db.qualityGates().associateProjectToQualityGate(project, qualityGate); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project), qualityGate); SearchResponse response = ws.newRequest() .setParam(PARAM_GATE_ID, valueOf(qualityGate.getId())) @@ -119,8 +121,8 @@ public class SearchActionTest { public void return_all_projects() { OrganizationDto organization = db.organizations().insert(); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto unassociatedProject = db.components().insertPublicProject(organization); - ComponentDto associatedProject = db.components().insertPublicProject(organization); + ProjectDto unassociatedProject = db.components().insertPublicProjectDto(organization); + ProjectDto associatedProject = db.components().insertPublicProjectDto(organization); db.qualityGates().associateProjectToQualityGate(associatedProject, qualityGate); SearchResponse response = ws.newRequest() @@ -132,16 +134,16 @@ public class SearchActionTest { assertThat(response.getResultsList()) .extracting(Result::getName, Result::getKey, Result::getSelected) .containsExactlyInAnyOrder( - tuple(associatedProject.name(), associatedProject.getKey(), true), - tuple(unassociatedProject.name(), unassociatedProject.getKey(), false)); + tuple(associatedProject.getName(), associatedProject.getKey(), true), + tuple(unassociatedProject.getName(), unassociatedProject.getKey(), false)); } @Test public void return_only_associated_project() { OrganizationDto organization = db.organizations().insert(); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto associatedProject = db.components().insertPublicProject(organization); - ComponentDto unassociatedProject = db.components().insertPublicProject(organization); + ProjectDto associatedProject = db.components().insertPublicProjectDto(organization); + ProjectDto unassociatedProject = db.components().insertPublicProjectDto(organization); db.qualityGates().associateProjectToQualityGate(associatedProject, qualityGate); SearchResponse response = ws.newRequest() @@ -152,16 +154,16 @@ public class SearchActionTest { assertThat(response.getResultsList()) .extracting(Result::getName, Result::getSelected) - .containsExactlyInAnyOrder(tuple(associatedProject.name(), true)) - .doesNotContain(tuple(unassociatedProject.name(), false)); + .containsExactlyInAnyOrder(tuple(associatedProject.getName(), true)) + .doesNotContain(tuple(unassociatedProject.getName(), false)); } @Test public void return_only_unassociated_project() { OrganizationDto organization = db.organizations().insert(); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto associatedProject = db.components().insertPublicProject(organization); - ComponentDto unassociatedProject = db.components().insertPublicProject(organization); + ProjectDto associatedProject = db.components().insertPublicProjectDto(organization); + ProjectDto unassociatedProject = db.components().insertPublicProjectDto(organization); db.qualityGates().associateProjectToQualityGate(associatedProject, qualityGate); SearchResponse response = ws.newRequest() @@ -172,8 +174,8 @@ public class SearchActionTest { assertThat(response.getResultsList()) .extracting(Result::getName, Result::getSelected) - .containsExactlyInAnyOrder(tuple(unassociatedProject.name(), false)) - .doesNotContain(tuple(associatedProject.name(), true)); + .containsExactlyInAnyOrder(tuple(unassociatedProject.getName(), false)) + .doesNotContain(tuple(associatedProject.getName(), true)); } @Test @@ -221,9 +223,9 @@ public class SearchActionTest { public void test_paging() { OrganizationDto organization = db.organizations().insert(); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project1 = db.components().insertPublicProject(organization, p -> p.setName("Project 1")); - ComponentDto project2 = db.components().insertPublicProject(organization, p -> p.setName("Project 2")); - ComponentDto project3 = db.components().insertPublicProject(organization, p -> p.setName("Project 3")); + ProjectDto project1 = db.components().insertPublicProjectDto(organization); + ProjectDto project2 = db.components().insertPublicProjectDto(organization); + ProjectDto project3 = db.components().insertPublicProjectDto(organization); db.qualityGates().associateProjectToQualityGate(project1, qualityGate); // Return partial result on first page @@ -235,8 +237,8 @@ public class SearchActionTest { .setParam(PARAM_PAGE_SIZE, "1") .executeProtobuf(SearchResponse.class) .getResultsList()) - .extracting(Result::getName) - .containsExactlyInAnyOrder(project1.name()); + .extracting(Result::getName) + .containsExactlyInAnyOrder(project1.getName()); // Return partial result on second page assertThat(ws.newRequest() @@ -247,8 +249,8 @@ public class SearchActionTest { .setParam(PARAM_PAGE_SIZE, "1") .executeProtobuf(SearchResponse.class) .getResultsList()) - .extracting(Result::getName) - .containsExactlyInAnyOrder(project2.name()); + .extracting(Result::getName) + .containsExactlyInAnyOrder(project2.getName()); // Return partial result on first page assertThat(ws.newRequest() @@ -259,8 +261,8 @@ public class SearchActionTest { .setParam(PARAM_PAGE_SIZE, "2") .executeProtobuf(SearchResponse.class) .getResultsList()) - .extracting(Result::getName) - .containsExactlyInAnyOrder(project1.name(), project2.name()); + .extracting(Result::getName) + .containsExactlyInAnyOrder(project1.getName(), project2.getName()); // Return all result on first page assertThat(ws.newRequest() @@ -271,8 +273,8 @@ public class SearchActionTest { .setParam(PARAM_PAGE_SIZE, "3") .executeProtobuf(SearchResponse.class) .getResultsList()) - .extracting(Result::getName) - .containsExactlyInAnyOrder(project1.name(), project2.name(), project3.name()); + .extracting(Result::getName) + .containsExactlyInAnyOrder(project1.getName(), project2.getName(), project3.getName()); // Return no result as page index is off limit assertThat(ws.newRequest() @@ -283,8 +285,8 @@ public class SearchActionTest { .setParam(PARAM_PAGE_SIZE, "3") .executeProtobuf(SearchResponse.class) .getResultsList()) - .extracting(Result::getName) - .isEmpty(); + .extracting(Result::getName) + .isEmpty(); } @Test @@ -292,7 +294,7 @@ public class SearchActionTest { OrganizationDto organization = db.organizations().insert(); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization); for (int i = 0; i < 20; i++) { - ComponentDto project = db.components().insertPublicProject(organization); + ProjectDto project = db.components().insertPublicProjectDto(organization); db.qualityGates().associateProjectToQualityGate(project, qualityGate); } userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); @@ -317,7 +319,7 @@ public class SearchActionTest { OrganizationDto organization = db.organizations().insert(); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization); for (int i = 0; i < 20; i++) { - ComponentDto project = db.components().insertPublicProject(organization); + ProjectDto project = db.components().insertPublicProjectDto(organization); db.qualityGates().associateProjectToQualityGate(project, qualityGate); } userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); @@ -343,8 +345,8 @@ public class SearchActionTest { OrganizationDto otherOrganization = db.organizations().insert(); QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization); QualityGateDto otherQualityGate = db.qualityGates().insertQualityGate(otherOrganization); - ComponentDto project = db.components().insertPublicProject(organization); - ComponentDto otherProject = db.components().insertPublicProject(otherOrganization); + ProjectDto project = db.components().insertPublicProjectDto(organization); + ProjectDto otherProject = db.components().insertPublicProjectDto(otherOrganization); db.qualityGates().associateProjectToQualityGate(project, qualityGate); db.qualityGates().associateProjectToQualityGate(otherProject, otherQualityGate); @@ -356,7 +358,7 @@ public class SearchActionTest { assertThat(response.getResultsList()) .extracting(Result::getName) - .containsExactlyInAnyOrder(project.name()); + .containsExactlyInAnyOrder(project.getName()); } @Test diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/SelectActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/SelectActionTest.java index 7fe8546a51d..adcca4d1e5b 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/SelectActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/SelectActionTest.java @@ -30,6 +30,7 @@ import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; @@ -53,43 +54,11 @@ public class SelectActionTest { public DbTester db = DbTester.create(System2.INSTANCE); private DbClient dbClient = db.getDbClient(); - private SelectAction underTest = new SelectAction(dbClient, TestComponentFinder.from(db), - new QualityGatesWsSupport(db.getDbClient(), userSession, TestDefaultOrganizationProvider.from(db))); + private ComponentFinder componentFinder = TestComponentFinder.from(db); + private SelectAction underTest = new SelectAction(dbClient, new QualityGatesWsSupport(db.getDbClient(), userSession, TestDefaultOrganizationProvider.from(db), componentFinder)); private WsActionTester ws = new WsActionTester(underTest); @Test - public void select_by_id() { - OrganizationDto organization = db.organizations().insert(); - userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); - QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); - - ws.newRequest() - .setParam("gateId", qualityGate.getId().toString()) - .setParam("projectId", project.getId().toString()) - .setParam("organization", organization.getKey()) - .execute(); - - assertSelected(qualityGate, project); - } - - @Test - public void select_by_uuid() { - OrganizationDto organization = db.organizations().insert(); - userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); - QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); - - ws.newRequest() - .setParam("gateId", qualityGate.getId().toString()) - .setParam("projectId", project.uuid()) - .setParam("organization", organization.getKey()) - .execute(); - - assertSelected(qualityGate, project); - } - - @Test public void select_by_key() { OrganizationDto organization = db.organizations().insert(); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); @@ -231,20 +200,6 @@ public class SelectActionTest { } @Test - public void fail_when_no_project_id() { - OrganizationDto organization = db.organizations().insert(); - userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); - QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - - expectedException.expect(NotFoundException.class); - ws.newRequest() - .setParam("gateId", qualityGate.getId().toString()) - .setParam("projectId", String.valueOf((Long) 1L)) - .setParam("organization", organization.getKey()) - .execute(); - } - - @Test public void fail_when_no_project_key() { OrganizationDto organization = db.organizations().insert(); userSession.addPermission(ADMINISTER_QUALITY_GATES, organization); @@ -307,12 +262,12 @@ public class SelectActionTest { public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); ws.newRequest() .setParam("gateId", qualityGate.getId().toString()) @@ -321,24 +276,6 @@ public class SelectActionTest { .execute(); } - @Test - public void fail_when_using_branch_id() { - OrganizationDto organization = db.organizations().insert(); - QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); - ComponentDto project = db.components().insertMainBranch(organization); - userSession.logIn().addProjectPermission(ADMIN, project); - ComponentDto branch = db.components().insertProjectBranch(project); - - expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component id '%s' not found", branch.uuid())); - - ws.newRequest() - .setParam("gateId", qualityGate.getId().toString()) - .setParam("projectId", branch.uuid()) - .setParam("organization", organization.getKey()) - .execute(); - } - private void assertSelected(QualityGateDto qualityGate, ComponentDto project) { Optional<String> qGateUuid = db.qualityGates().selectQGateUuidByComponentUuid(project.uuid()); assertThat(qGateUuid) diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ShowActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ShowActionTest.java index 3e196033e09..f92fd2d43ae 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ShowActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/ShowActionTest.java @@ -32,6 +32,7 @@ import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.user.UserDto; +import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.organization.DefaultOrganizationProvider; @@ -64,7 +65,7 @@ public class ShowActionTest { private WsActionTester ws = new WsActionTester( new ShowAction(db.getDbClient(), new QualityGateFinder(db.getDbClient()), - new QualityGatesWsSupport(db.getDbClient(), userSession, defaultOrganizationProvider))); + new QualityGatesWsSupport(db.getDbClient(), userSession, defaultOrganizationProvider, TestComponentFinder.from(db)))); @Test public void show() { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/UpdateConditionActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/UpdateConditionActionTest.java index 73d0917e1be..f655723b2f4 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/UpdateConditionActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualitygate/ws/UpdateConditionActionTest.java @@ -36,6 +36,7 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.db.qualitygate.QualityGateConditionDto; import org.sonar.db.qualitygate.QualityGateDto; +import org.sonar.server.component.TestComponentFinder; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; @@ -72,7 +73,7 @@ public class UpdateConditionActionTest { private DbClient dbClient = db.getDbClient(); private DbSession dbSession = db.getSession(); private UpdateConditionAction underTest = new UpdateConditionAction(dbClient, new QualityGateConditionsUpdater(dbClient), - new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider)); + new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider, TestComponentFinder.from(db))); private WsActionTester ws = new WsActionTester(underTest); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/QProfileFactoryImplTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/QProfileFactoryImplTest.java index 06bfad67bc2..7de814aad06 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/QProfileFactoryImplTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/QProfileFactoryImplTest.java @@ -34,8 +34,8 @@ import org.sonar.core.util.SequenceUuidFactory; import org.sonar.core.util.Uuids; import org.sonar.db.DbSession; import org.sonar.db.DbTester; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualityprofile.ActiveRuleDto; import org.sonar.db.qualityprofile.ActiveRuleParamDto; import org.sonar.db.qualityprofile.OrgQProfileDto; @@ -160,7 +160,7 @@ public class QProfileFactoryImplTest { public void delete_removes_custom_profile_from_project_associations() { OrganizationDto org = db.organizations().insert(); QProfileDto profile = createCustomProfile(org); - ComponentDto project = db.components().insertPrivateProject(org); + ProjectDto project = db.components().insertPrivateProjectDto(org); db.qualityProfiles().associateWithProject(project, profile); underTest.delete(dbSession, asList(profile)); @@ -188,7 +188,7 @@ public class QProfileFactoryImplTest { public void delete_builtin_profile_associated_to_project() { RulesProfileDto builtInProfile = createBuiltInProfile(); OrganizationDto org = db.organizations().insert(); - ComponentDto project = db.components().insertPrivateProject(org); + ProjectDto project = db.components().insertPrivateProjectDto(org); QProfileDto profile = associateBuiltInProfileToOrganization(builtInProfile, org); db.qualityProfiles().associateWithProject(project, profile); assertThat(db.getDbClient().qualityProfileDao().selectAssociatedToProjectAndLanguage(dbSession, project, profile.getLanguage())).isNotNull(); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/AddProjectActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/AddProjectActionTest.java index 5e18755c476..aad58423dff 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/AddProjectActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/AddProjectActionTest.java @@ -30,6 +30,7 @@ import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.user.UserDto; import org.sonar.server.component.TestComponentFinder; @@ -87,7 +88,7 @@ public class AddProjectActionTest { @Test public void add_project_on_profile_of_default_organization() { logInAsProfileAdmin(db.getDefaultOrganization()); - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization(), qp -> qp.setLanguage("xoo")); TestResponse response = call(project, profile); @@ -100,7 +101,7 @@ public class AddProjectActionTest { public void add_project_on_profile_of_specified_organization() { OrganizationDto org1 = db.organizations().insert(); logInAsProfileAdmin(org1); - ComponentDto project = db.components().insertPrivateProject(org1); + ProjectDto project = db.components().insertPrivateProjectDto(org1); QProfileDto profile = db.qualityProfiles().insert(org1, p -> p.setLanguage(LANGUAGE_1)); TestResponse response = call(org1, project, profile); @@ -115,7 +116,7 @@ public class AddProjectActionTest { UserDto user = db.users().insertUser(); QProfileDto qualityProfile = db.qualityProfiles().insert(organization, qp -> qp.setLanguage(LANGUAGE_1)); db.qualityProfiles().addUserPermission(qualityProfile, user); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); userSession.logIn(user); call(organization, project, qualityProfile); @@ -128,7 +129,7 @@ public class AddProjectActionTest { OrganizationDto org1 = db.organizations().insert(); OrganizationDto org2 = db.organizations().insert(); logInAsProfileAdmin(org2); - ComponentDto project = db.components().insertPrivateProject(org1); + ProjectDto project = db.components().insertPrivateProjectDto(org1); QProfileDto profileInOrg2 = db.qualityProfiles().insert(org2, p -> p.setLanguage(LANGUAGE_1)); expectedException.expect(IllegalArgumentException.class); @@ -142,7 +143,7 @@ public class AddProjectActionTest { OrganizationDto org1 = db.organizations().insert(); OrganizationDto org2 = db.organizations().insert(); logInAsProfileAdmin(org1); - ComponentDto project = db.components().insertPrivateProject(org1); + ProjectDto project = db.components().insertPrivateProjectDto(org1); QProfileDto profileInOrg2 = db.qualityProfiles().insert(org2, p -> p.setLanguage(LANGUAGE_1)); expectedException.expect(NotFoundException.class); @@ -156,7 +157,7 @@ public class AddProjectActionTest { public void change_association_in_default_organization() { logInAsProfileAdmin(db.getDefaultOrganization()); - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); // two profiles on same language QProfileDto profile1 = db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage(LANGUAGE_1)); QProfileDto profile2 = db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage(LANGUAGE_1)); @@ -171,7 +172,7 @@ public class AddProjectActionTest { @Test public void changing_association_does_not_change_other_language_associations() { logInAsProfileAdmin(db.getDefaultOrganization()); - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); QProfileDto profile1Language1 = db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage(LANGUAGE_1)); QProfileDto profile2Language2 = db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage(LANGUAGE_2)); QProfileDto profile3Language1 = db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage(LANGUAGE_1)); @@ -185,7 +186,7 @@ public class AddProjectActionTest { @Test public void project_administrator_can_change_profile() { - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization(), qp -> qp.setLanguage("xoo")); userSession.logIn(db.users().insertUser()).addProjectPermission(UserRole.ADMIN, project); @@ -197,7 +198,7 @@ public class AddProjectActionTest { @Test public void throw_ForbiddenException_if_not_project_nor_organization_administrator() { userSession.logIn(db.users().insertUser()); - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization(), qp -> qp.setLanguage("xoo")); expectedException.expect(ForbiddenException.class); @@ -209,7 +210,7 @@ public class AddProjectActionTest { @Test public void throw_UnauthorizedException_if_not_logged_in() { userSession.anonymous(); - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization()); expectedException.expect(UnauthorizedException.class); @@ -224,7 +225,7 @@ public class AddProjectActionTest { QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization()); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component key 'unknown' not found"); + expectedException.expectMessage("Project 'unknown' not found"); tester.newRequest() .setParam("project", "unknown") @@ -250,13 +251,13 @@ public class AddProjectActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn(db.users().insertUser()).addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); QProfileDto profile = db.qualityProfiles().insert(organization); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); tester.newRequest() .setParam("project", branch.getDbKey()) @@ -264,12 +265,12 @@ public class AddProjectActionTest { .execute(); } - private void assertProjectIsAssociatedToProfile(ComponentDto project, QProfileDto profile) { + private void assertProjectIsAssociatedToProfile(ProjectDto project, QProfileDto profile) { QProfileDto loaded = dbClient.qualityProfileDao().selectAssociatedToProjectAndLanguage(db.getSession(), project, profile.getLanguage()); assertThat(loaded.getKee()).isEqualTo(profile.getKee()); } - private void assertProjectIsNotAssociatedToProfile(ComponentDto project, QProfileDto profile) { + private void assertProjectIsNotAssociatedToProfile(ProjectDto project, QProfileDto profile) { QProfileDto loaded = dbClient.qualityProfileDao().selectAssociatedToProjectAndLanguage(db.getSession(), project, profile.getLanguage()); assertThat(loaded == null || !loaded.getKee().equals(profile.getKee())).isTrue(); } @@ -278,7 +279,7 @@ public class AddProjectActionTest { userSession.logIn(db.users().insertUser()).addPermission(ADMINISTER_QUALITY_PROFILES, organization); } - private TestResponse call(ComponentDto project, QProfileDto qualityProfile) { + private TestResponse call(ProjectDto project, QProfileDto qualityProfile) { TestRequest request = tester.newRequest() .setParam("project", project.getKey()) .setParam("language", qualityProfile.getLanguage()) @@ -286,7 +287,7 @@ public class AddProjectActionTest { return request.execute(); } - private TestResponse call(OrganizationDto organization, ComponentDto project, QProfileDto qualityProfile) { + private TestResponse call(OrganizationDto organization, ProjectDto project, QProfileDto qualityProfile) { TestRequest request = tester.newRequest() .setParam("organization", organization.getKey()) .setParam("project", project.getKey()) diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/DeleteActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/DeleteActionTest.java index 57070ad8faa..b3b4ac5a834 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/DeleteActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/DeleteActionTest.java @@ -31,8 +31,8 @@ import org.sonar.core.util.UuidFactoryFast; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.DbTester; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.user.UserDto; import org.sonar.server.exceptions.BadRequestException; @@ -79,7 +79,7 @@ public class DeleteActionTest { @Test public void delete_profile_by_language_and_name_in_default_organization() { OrganizationDto organization = db.getDefaultOrganization(); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); QProfileDto profile1 = createProfile(organization); QProfileDto profile2 = createProfile(organization); db.qualityProfiles().associateWithProject(project, profile1); @@ -101,7 +101,7 @@ public class DeleteActionTest { @Test public void delete_profile_by_language_and_name_in_specified_organization() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); QProfileDto profile1 = createProfile(organization); QProfileDto profile2 = createProfile(organization); db.qualityProfiles().associateWithProject(project, profile1); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ProjectsActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ProjectsActionTest.java index ead21bf07de..4ebfb623b71 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ProjectsActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ProjectsActionTest.java @@ -28,6 +28,7 @@ import org.sonar.api.utils.System2; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.user.UserDto; import org.sonar.server.exceptions.ForbiddenException; @@ -63,7 +64,7 @@ public class ProjectsActionTest { ComponentDto project1 = db.components().insertPrivateProject(organization); ComponentDto project2 = db.components().insertPrivateProject(organization); QProfileDto qualityProfile = db.qualityProfiles().insert(organization); - associateProjectsWithProfile(qualityProfile, project1, project2); + associateProjectsWithProfile(qualityProfile, db.components().getProjectDto(project1), db.components().getProjectDto(project2)); // user only sees project1 UserDto user = db.users().insertUser(); db.users().insertProjectPermissionOnUser(user, USER, project1); @@ -86,10 +87,10 @@ public class ProjectsActionTest { @Test public void paginate() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project1 = db.components().insertPublicProject(organization, p -> p.setName("Project One")); - ComponentDto project2 = db.components().insertPublicProject(organization, p -> p.setName("Project Two")); - ComponentDto project3 = db.components().insertPublicProject(organization, p -> p.setName("Project Three")); - ComponentDto project4 = db.components().insertPublicProject(organization, p -> p.setName("Project Four")); + ProjectDto project1 = db.components().insertPublicProjectDto(organization, p -> p.setName("Project One")); + ProjectDto project2 = db.components().insertPublicProjectDto(organization, p -> p.setName("Project Two")); + ProjectDto project3 = db.components().insertPublicProjectDto(organization, p -> p.setName("Project Three")); + ProjectDto project4 = db.components().insertPublicProjectDto(organization, p -> p.setName("Project Four")); QProfileDto qualityProfile = db.qualityProfiles().insert(organization); associateProjectsWithProfile(qualityProfile, project1, project2, project3, project4); @@ -195,8 +196,8 @@ public class ProjectsActionTest { @Test public void show_unselected() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project1 = db.components().insertPublicProject(organization); - ComponentDto project2 = db.components().insertPublicProject(organization); + ProjectDto project1 = db.components().insertPublicProjectDto(organization); + ProjectDto project2 = db.components().insertPublicProjectDto(organization); QProfileDto qualityProfile = db.qualityProfiles().insert(organization); associateProjectsWithProfile(qualityProfile, project1); @@ -216,10 +217,10 @@ public class ProjectsActionTest { @Test public void show_all() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project1 = db.components().insertPublicProject(organization, p -> p.setName("Project 1")); - ComponentDto project2 = db.components().insertPublicProject(organization, p -> p.setName("Project 2")); - ComponentDto project3 = db.components().insertPublicProject(organization, p -> p.setName("Project 3")); - ComponentDto project4 = db.components().insertPublicProject(organization, p -> p.setName("Project 4")); + ProjectDto project1 = db.components().insertPublicProjectDto(organization); + ProjectDto project2 = db.components().insertPublicProjectDto(organization); + ProjectDto project3 = db.components().insertPublicProjectDto(organization); + ProjectDto project4 = db.components().insertPublicProjectDto(organization); QProfileDto qualityProfile1 = db.qualityProfiles().insert(organization); associateProjectsWithProfile(qualityProfile1, project1, project2); QProfileDto qualityProfile2 = db.qualityProfiles().insert(organization); @@ -254,10 +255,10 @@ public class ProjectsActionTest { @Test public void filter_on_name() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project1 = db.components().insertPublicProject(organization, p -> p.setName("Project One")); - ComponentDto project2 = db.components().insertPublicProject(organization, p -> p.setName("Project Two")); - ComponentDto project3 = db.components().insertPublicProject(organization, p -> p.setName("Project Three")); - ComponentDto project4 = db.components().insertPublicProject(organization, p -> p.setName("Project Four")); + ProjectDto project1 = db.components().insertPublicProjectDto(organization, p -> p.setName("Project One")); + ProjectDto project2 = db.components().insertPublicProjectDto(organization, p -> p.setName("Project Two")); + ProjectDto project3 = db.components().insertPublicProjectDto(organization, p -> p.setName("Project Three")); + ProjectDto project4 = db.components().insertPublicProjectDto(organization, p -> p.setName("Project Four")); QProfileDto qualityProfile = db.qualityProfiles().insert(organization); associateProjectsWithProfile(qualityProfile, project1, project2); @@ -271,12 +272,12 @@ public class ProjectsActionTest { " [\n" + " {\n" + " \"key\": \"" + project3.getKey() + "\",\n" + - " \"name\": \"Project Three\",\n" + + " \"name\": \"" + project3.getName() + "\",\n" + " \"selected\": false\n" + " },\n" + " {\n" + " \"key\": \"" + project2.getKey() + "\",\n" + - " \"name\": \"Project Two\",\n" + + " \"name\": \"" + project2.getName() + "\",\n" + " \"selected\": true\n" + " }\n" + " ]}\n"); @@ -285,7 +286,7 @@ public class ProjectsActionTest { @Test public void return_deprecated_uuid_field() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPublicProject(organization); + ProjectDto project = db.components().insertPublicProjectDto(organization); QProfileDto qualityProfile = db.qualityProfiles().insert(organization); associateProjectsWithProfile(qualityProfile, project); @@ -296,7 +297,7 @@ public class ProjectsActionTest { .assertJson("{\"results\":\n" + " [\n" + " {\n" + - " \"id\": \"" + project.uuid() + "\",\n" + + " \"id\": \"" + project.getUuid() + "\",\n" + " \"key\": \"" + project.getKey() + "\",\n" + " }\n" + " ]}"); @@ -305,7 +306,7 @@ public class ProjectsActionTest { @Test public void projects_on_paid_organization() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPublicProject(organization); + ProjectDto project = db.components().insertPublicProjectDto(organization); QProfileDto qualityProfile = db.qualityProfiles().insert(organization); associateProjectsWithProfile(qualityProfile, project); UserDto user = db.users().insertUser(); @@ -360,8 +361,8 @@ public class ProjectsActionTest { Param query = definition.param("q"); } - private void associateProjectsWithProfile(QProfileDto profile, ComponentDto... projects) { - for (ComponentDto project : projects) { + private void associateProjectsWithProfile(QProfileDto profile, ProjectDto... projects) { + for (ProjectDto project : projects) { db.getDbClient().qualityProfileDao().insertProjectProfileAssociation(db.getSession(), project, profile); } db.commit(); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/RemoveProjectActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/RemoveProjectActionTest.java index 005751b8c80..0193a9eaf44 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/RemoveProjectActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/RemoveProjectActionTest.java @@ -32,6 +32,7 @@ import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ResourceTypesRule; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.user.UserDto; import org.sonar.server.component.ComponentFinder; @@ -92,7 +93,7 @@ public class RemoveProjectActionTest { public void remove_profile_from_project_in_default_organization() { logInAsProfileAdmin(); - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); QProfileDto profileLang1 = db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage(LANGUAGE_1)); QProfileDto profileLang2 = db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage(LANGUAGE_2)); db.qualityProfiles().associateWithProject(project, profileLang1); @@ -109,7 +110,7 @@ public class RemoveProjectActionTest { public void removal_does_not_fail_if_profile_is_not_associated_to_project() { logInAsProfileAdmin(); - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization(), qp -> qp.setLanguage("xoo")); TestResponse response = call(db.getDefaultOrganization(), project, profile); @@ -120,7 +121,7 @@ public class RemoveProjectActionTest { @Test public void project_administrator_can_remove_profile() { - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization(), qp -> qp.setLanguage("xoo")); db.qualityProfiles().associateWithProject(project, profile); userSession.logIn(db.users().insertUser()).addProjectPermission(UserRole.ADMIN, project); @@ -133,7 +134,7 @@ public class RemoveProjectActionTest { @Test public void as_qprofile_editor() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); QProfileDto profile = db.qualityProfiles().insert(organization, p -> p.setLanguage(LANGUAGE_1)); db.qualityProfiles().associateWithProject(project, profile); UserDto user = db.users().insertUser(); @@ -148,7 +149,7 @@ public class RemoveProjectActionTest { @Test public void fail_if_not_enough_permissions() { userSession.logIn(db.users().insertUser()); - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization(), qp -> qp.setLanguage("xoo")); expectedException.expect(ForbiddenException.class); @@ -160,7 +161,7 @@ public class RemoveProjectActionTest { @Test public void fail_if_not_logged_in() { userSession.anonymous(); - ComponentDto project = db.components().insertPrivateProject(db.getDefaultOrganization()); + ProjectDto project = db.components().insertPrivateProjectDto(db.getDefaultOrganization()); QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization()); expectedException.expect(UnauthorizedException.class); @@ -175,7 +176,7 @@ public class RemoveProjectActionTest { QProfileDto profile = db.qualityProfiles().insert(db.getDefaultOrganization()); expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component key 'unknown' not found"); + expectedException.expectMessage("Project 'unknown' not found"); ws.newRequest() .setParam("project", "unknown") @@ -201,13 +202,13 @@ public class RemoveProjectActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); QProfileDto profile = db.qualityProfiles().insert(organization); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", branch.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", branch.getDbKey())); ws.newRequest() .setParam("project", branch.getDbKey()) @@ -216,12 +217,12 @@ public class RemoveProjectActionTest { .execute(); } - private void assertProjectIsAssociatedToProfile(ComponentDto project, QProfileDto profile) { + private void assertProjectIsAssociatedToProfile(ProjectDto project, QProfileDto profile) { QProfileDto loaded = dbClient.qualityProfileDao().selectAssociatedToProjectAndLanguage(db.getSession(), project, profile.getLanguage()); assertThat(loaded.getKee()).isEqualTo(profile.getKee()); } - private void assertProjectIsNotAssociatedToProfile(ComponentDto project, QProfileDto profile) { + private void assertProjectIsNotAssociatedToProfile(ProjectDto project, QProfileDto profile) { QProfileDto loaded = dbClient.qualityProfileDao().selectAssociatedToProjectAndLanguage(db.getSession(), project, profile.getLanguage()); assertThat(loaded == null || !loaded.getKee().equals(profile.getKee())).isTrue(); } @@ -230,17 +231,17 @@ public class RemoveProjectActionTest { userSession.logIn(db.users().insertUser()).addPermission(ADMINISTER_QUALITY_PROFILES, db.getDefaultOrganization()); } - private TestResponse call(ComponentDto project, QProfileDto qualityProfile) { + private TestResponse call(ProjectDto project, QProfileDto qualityProfile) { TestRequest request = ws.newRequest() - .setParam("project", project.getDbKey()) + .setParam("project", project.getKey()) .setParam("language", qualityProfile.getLanguage()) .setParam("qualityProfile", qualityProfile.getName()); return request.execute(); } - private TestResponse call(OrganizationDto organization, ComponentDto project, QProfileDto qualityProfile) { + private TestResponse call(OrganizationDto organization, ProjectDto project, QProfileDto qualityProfile) { TestRequest request = ws.newRequest() - .setParam("project", project.getDbKey()) + .setParam("project", project.getKey()) .setParam("organization", organization.getKey()) .setParam("language", qualityProfile.getLanguage()) .setParam("qualityProfile", qualityProfile.getName()); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/SearchActionTest.java index aa48031f94e..1f1d3b56e41 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/SearchActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/SearchActionTest.java @@ -35,6 +35,7 @@ import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.qualityprofile.QualityProfileDbTester; import org.sonar.db.rule.RuleDefinitionDto; @@ -223,32 +224,14 @@ public class SearchActionTest { @Test public void filter_on_project_key() { - ComponentDto project = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); QProfileDto profileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); QProfileDto defaultProfileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); QProfileDto defaultProfileOnXoo2 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO2.getKey())); db.qualityProfiles().associateWithProject(project, profileOnXoo1); db.qualityProfiles().setAsDefault(defaultProfileOnXoo1, defaultProfileOnXoo2); - SearchWsResponse result = call(ws.newRequest().setParam(PARAM_PROJECT, project.getDbKey())); - - assertThat(result.getProfilesList()) - .extracting(QualityProfile::getKey) - .containsExactlyInAnyOrder(profileOnXoo1.getKee(), defaultProfileOnXoo2.getKee()) - .doesNotContain(defaultProfileOnXoo1.getKee()); - } - - @Test - public void filter_on_module_key() { - ComponentDto project = db.components().insertPrivateProject(); - ComponentDto module = db.components().insertComponent(newModuleDto(project)); - QProfileDto profileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); - QProfileDto defaultProfileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); - QProfileDto defaultProfileOnXoo2 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO2.getKey())); - db.qualityProfiles().associateWithProject(project, profileOnXoo1); - db.qualityProfiles().setAsDefault(defaultProfileOnXoo1, defaultProfileOnXoo2); - - SearchWsResponse result = call(ws.newRequest().setParam(PARAM_PROJECT, module.getDbKey())); + SearchWsResponse result = call(ws.newRequest().setParam(PARAM_PROJECT, project.getKey())); assertThat(result.getProfilesList()) .extracting(QualityProfile::getKey) @@ -258,7 +241,7 @@ public class SearchActionTest { @Test public void filter_on_project_key_and_default() { - ComponentDto project = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); QProfileDto profileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); QProfileDto defaultProfileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); QProfileDto defaultProfileOnXoo2 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO2.getKey())); @@ -266,7 +249,7 @@ public class SearchActionTest { db.qualityProfiles().setAsDefault(defaultProfileOnXoo1, defaultProfileOnXoo2); SearchWsResponse result = call(ws.newRequest() - .setParam(PARAM_PROJECT, project.getDbKey()) + .setParam(PARAM_PROJECT, project.getKey()) .setParam(PARAM_DEFAULTS, "true")); assertThat(result.getProfilesList()) @@ -277,7 +260,7 @@ public class SearchActionTest { @Test public void filter_on_deprecated_project_key_and_default() { - ComponentDto project = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); QProfileDto profileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); QProfileDto defaultProfileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); QProfileDto defaultProfileOnXoo2 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO2.getKey())); @@ -285,7 +268,7 @@ public class SearchActionTest { db.qualityProfiles().setAsDefault(defaultProfileOnXoo1, defaultProfileOnXoo2); SearchWsResponse result = call(ws.newRequest() - .setParam(PARAM_PROJECT_KEY, project.getDbKey()) + .setParam(PARAM_PROJECT_KEY, project.getKey()) .setParam(PARAM_DEFAULTS, "true")); assertThat(result.getProfilesList()) @@ -294,17 +277,16 @@ public class SearchActionTest { .doesNotContain(defaultProfileOnXoo1.getKee(), profileOnXoo1.getKee()); } - @Test public void empty_when_filtering_on_project_and_no_language_installed() { WsActionTester ws = new WsActionTester(new SearchAction(userSession, new Languages(), dbClient, qProfileWsSupport, new ComponentFinder(dbClient, null))); db.qualityProfiles().insert(db.getDefaultOrganization()); - ComponentDto project = db.components().insertPrivateProject(); + ProjectDto project = db.components().insertPrivateProjectDto(); QProfileDto profileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); db.qualityProfiles().associateWithProject(project, profileOnXoo1); SearchWsResponse result = call(ws.newRequest() - .setParam(PARAM_PROJECT, project.getDbKey()) + .setParam(PARAM_PROJECT, project.getKey()) .setParam(PARAM_DEFAULTS, "true")); assertThat(result.getProfilesList()).isEmpty(); @@ -396,8 +378,8 @@ public class SearchActionTest { @Test public void statistics_on_projects() { - ComponentDto project1 = db.components().insertPrivateProject(); - ComponentDto project2 = db.components().insertPrivateProject(); + ProjectDto project1 = db.components().insertPrivateProjectDto(); + ProjectDto project2 = db.components().insertPrivateProjectDto(); QProfileDto profileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); QProfileDto defaultProfileOnXoo1 = db.qualityProfiles().insert(db.getDefaultOrganization(), q -> q.setLanguage(XOO1.getKey())); db.qualityProfiles().associateWithProject(project1, profileOnXoo1); @@ -456,30 +438,19 @@ public class SearchActionTest { @Test public void fail_if_project_does_not_exist() { expectedException.expect(NotFoundException.class); - expectedException.expectMessage("Component key 'unknown-project' not found"); + expectedException.expectMessage("Project 'unknown-project' not found"); call(ws.newRequest().setParam(PARAM_PROJECT, "unknown-project")); } @Test - public void fail_if_project_of_module_does_not_exist() { - ComponentDto project = db.components().insertPrivateProject(); - ComponentDto module = db.components().insertComponent(newModuleDto(project).setProjectUuid("unknown")); - - expectedException.expect(IllegalStateException.class); - expectedException.expectMessage(format("Project uuid of component uuid '%s' does not exist", module.uuid())); - - call(ws.newRequest().setParam(PARAM_PROJECT, module.getDbKey())); - } - - @Test public void fail_if_project_is_on_another_organization() { OrganizationDto organization = db.organizations().insert(); OrganizationDto anotherOrganization = db.organizations().insert(); ComponentDto project = db.components().insertPrivateProject(anotherOrganization); expectedException.expect(NotFoundException.class); - expectedException.expectMessage(format("Component key '%s' not found", project.getDbKey())); + expectedException.expectMessage(format("Project '%s' not found", project.getDbKey())); call(ws.newRequest() .setParam(PARAM_ORGANIZATION, organization.getKey()) @@ -540,7 +511,7 @@ public class SearchActionTest { .forEach(rule -> db.qualityProfiles().activateRule(sonarWayCs, rule)); // project range(0, 7) - .mapToObj(i -> db.components().insertPrivateProject(organization)) + .mapToObj(i -> db.components().insertPrivateProjectDto(organization)) .forEach(project -> db.qualityProfiles().associateWithProject(project, myBuProfile)); // User UserDto user = db.users().insertUser(); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ShowActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ShowActionTest.java index 4f5b65996bb..2a9da814cf6 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ShowActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ShowActionTest.java @@ -142,7 +142,7 @@ public class ShowActionTest { .forEach(r -> db.qualityProfiles().activateRule(profile, r)); // Projects range(0, 7) - .mapToObj(i -> db.components().insertPrivateProject()) + .mapToObj(i -> db.components().insertPrivateProjectDto()) .forEach(project -> db.qualityProfiles().associateWithProject(project, profile)); ShowResponse result = call(ws.newRequest().setParam(PARAM_KEY, profile.getKee())); @@ -175,7 +175,7 @@ public class ShowActionTest { CompareToSonarWay result = call(ws.newRequest() .setParam(PARAM_KEY, profile.getKee()) .setParam(PARAM_COMPARE_TO_SONAR_WAY, "true")) - .getCompareToSonarWay(); + .getCompareToSonarWay(); assertThat(result) .extracting(CompareToSonarWay::getProfile, CompareToSonarWay::getProfileName, CompareToSonarWay::getMissingRuleCount) @@ -195,7 +195,7 @@ public class ShowActionTest { CompareToSonarWay result = call(ws.newRequest() .setParam(PARAM_KEY, profile.getKee()) .setParam(PARAM_COMPARE_TO_SONAR_WAY, "true")) - .getCompareToSonarWay(); + .getCompareToSonarWay(); assertThat(result) .extracting(CompareToSonarWay::getProfile, CompareToSonarWay::getProfileName, CompareToSonarWay::getMissingRuleCount) @@ -259,7 +259,7 @@ public class ShowActionTest { CompareToSonarWay result = call(ws.newRequest() .setParam(PARAM_KEY, profile.getKee()) .setParam(PARAM_COMPARE_TO_SONAR_WAY, "true")) - .getCompareToSonarWay(); + .getCompareToSonarWay(); assertThat(result) .extracting(CompareToSonarWay::getProfile, CompareToSonarWay::getProfileName) @@ -275,7 +275,7 @@ public class ShowActionTest { CompareToSonarWay result = call(ws.newRequest() .setParam(PARAM_KEY, profile.getKee()) .setParam(PARAM_COMPARE_TO_SONAR_WAY, "true")) - .getCompareToSonarWay(); + .getCompareToSonarWay(); assertThat(result) .extracting(CompareToSonarWay::getProfile, CompareToSonarWay::getProfileName) @@ -346,7 +346,7 @@ public class ShowActionTest { .forEach(r -> db.qualityProfiles().activateRule(profile, r)); // Projects range(0, 7) - .mapToObj(i -> db.components().insertPrivateProject()) + .mapToObj(i -> db.components().insertPrivateProjectDto()) .forEach(project -> db.qualityProfiles().associateWithProject(project, profile)); ws = new WsActionTester( diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/ResetActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/ResetActionTest.java index 1e5c8dc9fb3..f44cebed3f9 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/ResetActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/ResetActionTest.java @@ -204,7 +204,7 @@ public class ResetActionTest { @Test public void remove_setting_on_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); ComponentDto branch = db.components().insertProjectBranch(project); definitions.addComponent(PropertyDefinition.builder("foo").onQualifiers(PROJECT).build()); propertyDb.insertProperties(newComponentPropertyDto(branch).setKey("foo").setValue("value")); @@ -365,7 +365,7 @@ public class ResetActionTest { @Test public void fail_when_using_branch_db_key() throws Exception { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); definitions.addComponent(PropertyDefinition.builder("foo").onQualifiers(PROJECT).build()); @@ -392,7 +392,7 @@ public class ResetActionTest { @Test public void fail_when_branch_not_found() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); logInAsProjectAdmin(project); ComponentDto branch = db.components().insertProjectBranch(project); String settingKey = "not_allowed_on_branch"; diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/SetActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/SetActionTest.java index 41027f97bf2..c25c8bb11d2 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/SetActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/SetActionTest.java @@ -908,7 +908,7 @@ public class SetActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); userSession.logIn().addProjectPermission(UserRole.ADMIN, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java index 44ccfc269f6..48f8a7a73f3 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/ValuesActionTest.java @@ -749,7 +749,7 @@ public class ValuesActionTest { @Test public void fail_when_using_branch_db_key() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPrivateProject(organization); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/HashActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/HashActionTest.java index a13911d31b5..faf4cedde18 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/HashActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/HashActionTest.java @@ -85,7 +85,7 @@ public class HashActionTest { @Test public void fail_when_using_branch_db_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto branch = db.components().insertProjectBranch(project); loginAsProjectViewer(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/IndexActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/IndexActionTest.java index 4f01cc29994..6ec084421f8 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/IndexActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/IndexActionTest.java @@ -118,7 +118,7 @@ public class IndexActionTest { @Test public void fail_when_using_branch_db_key() throws Exception { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto branch = db.components().insertProjectBranch(project); userSession.addProjectPermission(USER, project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/LinesActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/LinesActionTest.java index b84288f9554..846b9f6ce99 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/LinesActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/LinesActionTest.java @@ -122,7 +122,7 @@ public class LinesActionTest { @Test public void branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto file = db.components().insertComponent(newFileDto(branch)); @@ -145,7 +145,7 @@ public class LinesActionTest { @Test public void pull_request() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(PULL_REQUEST)); ComponentDto file = db.components().insertComponent(newFileDto(branch)); @@ -330,7 +330,7 @@ public class LinesActionTest { @Test public void fail_when_using_branch_db_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto branch = db.components().insertProjectBranch(project); userSession.addProjectPermission(UserRole.USER, project); @@ -344,7 +344,7 @@ public class LinesActionTest { @Test public void fail_when_using_branch_uuid() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto branch = db.components().insertProjectBranch(project); userSession.addProjectPermission(UserRole.USER, project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/RawActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/RawActionTest.java index 14f7eb1db2f..b1a71373a6f 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/RawActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/RawActionTest.java @@ -76,7 +76,7 @@ public class RawActionTest { @Test public void raw_from_branch_file() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.CODEVIEWER, project); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto file = db.components().insertComponent(newFileDto(branch)); @@ -106,7 +106,7 @@ public class RawActionTest { @Test public void fail_on_unknown_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.CODEVIEWER, project); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto file = db.components().insertComponent(newFileDto(branch)); @@ -123,7 +123,7 @@ public class RawActionTest { @Test public void fail_when_using_branch_db_key() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.CODEVIEWER, project); ComponentDto branch = db.components().insertProjectBranch(project); ComponentDto file = db.components().insertComponent(newFileDto(branch)); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/ScmActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/ScmActionTest.java index 8f614cc6281..6b45db4afef 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/ScmActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/source/ws/ScmActionTest.java @@ -209,7 +209,7 @@ public class ScmActionTest { @Test public void fail_when_using_branch_db_key() { - ComponentDto project = dbTester.components().insertMainBranch(); + ComponentDto project = dbTester.components().insertPrivateProject(); ComponentDto branch = dbTester.components().insertProjectBranch(project); userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java index 68a91ba2f41..ea329c28ac8 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/ComponentActionTest.java @@ -42,6 +42,7 @@ import org.sonar.core.platform.PluginRepository; import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.alm.ALM; +import org.sonar.db.component.BranchDto; import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; @@ -49,6 +50,7 @@ import org.sonar.db.component.SnapshotDto; import org.sonar.db.metric.MetricDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.permission.OrganizationPermission; +import org.sonar.db.project.ProjectDto; import org.sonar.db.property.PropertyDbTester; import org.sonar.db.property.PropertyDto; import org.sonar.db.qualitygate.QualityGateDto; @@ -155,7 +157,8 @@ public class ComponentActionTest { @Test public void return_favourite_for_branch() { ComponentDto project = insertOrganizationAndProject(); - ComponentDto branch = componentDbTester.insertProjectBranch(project, b -> b.setKey("feature1").setUuid("xyz")); UserDto user = db.users().insertUser("obiwan"); + ComponentDto branch = componentDbTester.insertProjectBranch(project, b -> b.setKey("feature1").setUuid("xyz")); + UserDto user = db.users().insertUser("obiwan"); propertyDbTester.insertProperty(new PropertyDto().setKey("favourite").setResourceId(project.getId()).setUserId(user.getId())); userSession.logIn(user).addProjectPermission(UserRole.USER, project); init(); @@ -193,7 +196,7 @@ public class ComponentActionTest { public void return_component_info_when_file_on_master() { OrganizationDto organization = db.organizations().insert(o -> o.setKey("my-org2")); db.qualityGates().createDefaultQualityGate(organization); - ComponentDto main = componentDbTester.insertMainBranch(organization, p -> p.setName("Sample"), p -> p.setDbKey("sample")); + ComponentDto main = componentDbTester.insertPrivateProject(organization, p -> p.setName("Sample"), p -> p.setDbKey("sample")); userSession.addProjectPermission(UserRole.USER, main); init(); @@ -211,7 +214,7 @@ public class ComponentActionTest { public void return_component_info_when_file_on_branch() { OrganizationDto organization = db.organizations().insertForKey("my-org2"); db.qualityGates().createDefaultQualityGate(organization); - ComponentDto project = componentDbTester.insertMainBranch(organization, p -> p.setName("Sample").setDbKey("sample")); + ComponentDto project = componentDbTester.insertPrivateProject(organization, p -> p.setName("Sample").setDbKey("sample")); ComponentDto branch = componentDbTester.insertProjectBranch(project, b -> b.setKey("feature1")); userSession.addProjectPermission(UserRole.USER, project); init(); @@ -283,29 +286,29 @@ public class ComponentActionTest { public void return_quality_gate_defined_on_project() { OrganizationDto organization = db.organizations().insert(o -> o.setKey("my-org")); db.qualityGates().createDefaultQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); QualityGateDto qualityGateDto = db.qualityGates().insertQualityGate(organization, qg -> qg.setName("Sonar way")); db.qualityGates().associateProjectToQualityGate(project, qualityGateDto); userSession.addProjectPermission(UserRole.USER, project); init(); - executeAndVerify(project.getDbKey(), "return_quality_gate.json"); + executeAndVerify(project.getKey(), "return_quality_gate.json"); } @Test public void quality_gate_for_a_branch() { OrganizationDto organization = db.organizations().insert(o -> o.setKey("my-org")); db.qualityGates().createDefaultQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); - ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)); + ProjectDto project = db.components().insertPrivateProjectDto(organization); + BranchDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH)); QualityGateDto qualityGateDto = db.qualityGates().insertQualityGate(organization, qg -> qg.setName("Sonar way")); db.qualityGates().associateProjectToQualityGate(project, qualityGateDto); userSession.addProjectPermission(UserRole.USER, project); init(); String json = ws.newRequest() - .setParam("componentKey", branch.getKey()) - .setParam("branch", branch.getBranch()) + .setParam("componentKey", project.getKey()) + .setParam("branch", branch.getKey()) .execute() .getInput(); @@ -336,7 +339,7 @@ public class ComponentActionTest { public void return_extensions_for_application() { OrganizationDto organization = db.organizations().insert(o -> o.setKey("my-org")); db.qualityGates().createDefaultQualityGate(organization); - ComponentDto project = db.components().insertPrivateProject(organization); + ProjectDto project = db.components().insertPrivateProjectDto(organization); Page page = Page.builder("my_plugin/app_page") .setName("App Page") .setScope(COMPONENT) @@ -595,7 +598,7 @@ public class ComponentActionTest { .setDbKey("org.codehaus.sonar:sonar") .setName("Sonarqube") .setDescription("Open source platform for continuous inspection of code quality"); - componentDbTester.insertComponent(project); + componentDbTester.insertPrivateProject(project); SnapshotDto analysis = newAnalysis(project) .setCreatedAt(parseDateTime("2016-12-06T11:44:00+0200").getTime()) .setProjectVersion("6.3") @@ -608,7 +611,7 @@ public class ComponentActionTest { createQProfile("qp1", "Sonar Way Java", "java"), createQProfile("qp2", "Sonar Way Xoo", "xoo")); QualityGateDto qualityGateDto = db.qualityGates().insertQualityGate(db.getDefaultOrganization(), qg -> qg.setName("Sonar way")); - db.qualityGates().associateProjectToQualityGate(project, qualityGateDto); + db.qualityGates().associateProjectToQualityGate(db.components().getProjectDto(project), qualityGateDto); userSession.logIn(user) .addProjectPermission(UserRole.USER, project) .addProjectPermission(UserRole.ADMIN, project); @@ -749,7 +752,7 @@ public class ComponentActionTest { private void executeAndVerify(String componentKey, String expectedJson) { verify(execute(componentKey), expectedJson); -} + } private void addQualityProfiles(ComponentDto project, QualityProfile... qps) { MetricDto metric = newMetricDto().setKey(QUALITY_PROFILES_KEY); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/MarketplaceActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/MarketplaceActionTest.java index 952cfb43be8..8590131e376 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/MarketplaceActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/ui/ws/MarketplaceActionTest.java @@ -125,7 +125,7 @@ public class MarketplaceActionTest { } private void setNcloc(double ncloc) { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPublicProject(); MetricDto nclocMetric = db.measures().insertMetric(m -> m.setValueType(INT.toString()).setKey(NCLOC_KEY)); db.measures().insertLiveMeasure(project, nclocMetric, m -> m.setValue(ncloc)); } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/CurrentActionHomepageTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/CurrentActionHomepageTest.java index 20a319f8321..3f26477d290 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/CurrentActionHomepageTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/CurrentActionHomepageTest.java @@ -191,7 +191,7 @@ public class CurrentActionHomepageTest { @Test public void return_homepage_when_set_to_a_branch() { - ComponentDto project = db.components().insertMainBranch(); + ComponentDto project = db.components().insertPrivateProject(); ComponentDto branch = db.components().insertProjectBranch(project); UserDto user = db.users().insertUser(u -> u.setHomepageType("PROJECT").setHomepageParameter(branch.uuid())); userSessionRule.logIn(user).addProjectPermission(USER, project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/CurrentActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/CurrentActionTest.java index 61c48b3e085..49286534145 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/CurrentActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/CurrentActionTest.java @@ -229,7 +229,7 @@ public class CurrentActionTest { .logIn(obiwan) .addPermission(SCAN, db.getDefaultOrganization()) .addPermission(ADMINISTER_QUALITY_PROFILES, db.getDefaultOrganization()) - .addProjectPermission(USER, componentDto); + .addProjectPermission(USER, db.components().getProjectDto(componentDto)); db.users().insertMember(db.users().insertGroup(newGroupDto().setName("Jedi")), obiwan); db.users().insertMember(db.users().insertGroup(newGroupDto().setName("Rebel")), obiwan); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/SetHomepageActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/SetHomepageActionTest.java index 96d00dd0fff..d2335d16e74 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/SetHomepageActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/user/ws/SetHomepageActionTest.java @@ -108,7 +108,7 @@ public class SetHomepageActionTest { @Test public void set_branch_homepage() { OrganizationDto organization = db.organizations().insert(); - ComponentDto project = db.components().insertMainBranch(organization); + ComponentDto project = db.components().insertPublicProject(organization); ComponentDto branch = db.components().insertProjectBranch(project); UserDto user = db.users().insertUser(); userSession.logIn(user); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/CreateActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/CreateActionTest.java index 141aca1b08f..95004f6d9f7 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/CreateActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/CreateActionTest.java @@ -31,7 +31,9 @@ import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDbTester; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDbTester; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.exceptions.UnauthorizedException; @@ -75,7 +77,8 @@ public class CreateActionTest { private UuidFactory uuidFactory = UuidFactoryFast.getInstance(); private WebhookSupport webhookSupport = new WebhookSupport(userSession); - private org.sonar.server.webhook.ws.CreateAction underTest = new CreateAction(dbClient, userSession, defaultOrganizationProvider, uuidFactory, webhookSupport); + private ComponentFinder componentFinder = new ComponentFinder(dbClient, null); + private org.sonar.server.webhook.ws.CreateAction underTest = new CreateAction(dbClient, userSession, defaultOrganizationProvider, uuidFactory, webhookSupport, componentFinder); private WsActionTester wsActionTester = new WsActionTester(underTest); @Test @@ -230,7 +233,7 @@ public class CreateActionTest { @Test public void fail_if_project_does_not_exist() { expectedException.expect(NotFoundException.class); - expectedException.expectMessage("No project with key 'inexistent-project-uuid'"); + expectedException.expectMessage("Project 'inexistent-project-uuid' not found"); userSession.logIn(); @@ -243,7 +246,7 @@ public class CreateActionTest { @Test public void fail_if_crossing_maximum_quantity_of_webhooks_on_this_project() { - ComponentDto project = componentDbTester.insertPrivateProject(); + ProjectDto project = componentDbTester.insertPrivateProjectDto(); expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage(format("Maximum number of webhook reached for project '%s'", project.getKey())); @@ -372,7 +375,6 @@ public class CreateActionTest { .execute(); } - @Test public void throw_IllegalArgumentException_if_project_key_greater_than_400() { String longProjectKey = generateStringWithLength(401); @@ -389,7 +391,6 @@ public class CreateActionTest { .executeProtobuf(CreateWsResponse.class); } - private static String generateStringWithLength(int length) { StringBuilder sb = new StringBuilder(length); for (int i = 0; i < length; i++) { diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/DeleteActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/DeleteActionTest.java index 4c4bf0c2ba8..435254cbd1d 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/DeleteActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/DeleteActionTest.java @@ -31,6 +31,7 @@ import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDbTester; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDbTester; import org.sonar.db.webhook.WebhookDeliveryDao; import org.sonar.db.webhook.WebhookDeliveryDbTester; @@ -96,7 +97,7 @@ public class DeleteActionTest { @Test public void delete_a_project_webhook() { - ComponentDto project = componentDbTester.insertPrivateProject(); + ProjectDto project = componentDbTester.insertPrivateProjectDto(); WebhookDto dto = webhookDbTester.insertWebhook(project); webhookDeliveryDbTester.insert(newDto().setWebhookUuid(dto.getUuid())); webhookDeliveryDbTester.insert(newDto().setWebhookUuid(dto.getUuid())); @@ -169,7 +170,7 @@ public class DeleteActionTest { @Test public void fail_if_no_permission_on_webhook_scope_project() { - ComponentDto project = componentDbTester.insertPrivateProject(); + ProjectDto project = componentDbTester.insertPrivateProjectDto(); WebhookDto dto = webhookDbTester.insertWebhook(project); userSession.logIn(); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/ListActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/ListActionTest.java index 1eee37b503f..9c869211bab 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/ListActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/ListActionTest.java @@ -31,9 +31,11 @@ import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDbTester; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDbTester; import org.sonar.db.webhook.WebhookDeliveryDbTester; import org.sonar.db.webhook.WebhookDto; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.exceptions.UnauthorizedException; @@ -74,7 +76,8 @@ public class ListActionTest { private DbClient dbClient = db.getDbClient(); private DefaultOrganizationProvider defaultOrganizationProvider = from(db); private WebhookSupport webhookSupport = new WebhookSupport(userSession); - private ListAction underTest = new ListAction(dbClient, userSession, defaultOrganizationProvider, webhookSupport); + private ComponentFinder componentFinder = new ComponentFinder(dbClient, null); + private ListAction underTest = new ListAction(dbClient, userSession, defaultOrganizationProvider, webhookSupport, componentFinder); private ComponentDbTester componentDbTester = db.components(); private WebhookDbTester webhookDbTester = db.webhooks(); @@ -185,7 +188,7 @@ public class ListActionTest { @Test public void list_project_webhooks_when_no_organization_is_provided() { - ComponentDto project1 = componentDbTester.insertPrivateProject(); + ProjectDto project1 = componentDbTester.insertPrivateProjectDto(); userSession.logIn().addProjectPermission(ADMIN, project1); WebhookDto dto1 = webhookDbTester.insertWebhook(project1); @@ -223,7 +226,7 @@ public class ListActionTest { @Test public void list_project_webhooks_when_organization_is_provided() { OrganizationDto organization = organizationDbTester.insert(); - ComponentDto project = componentDbTester.insertPrivateProject(organization); + ProjectDto project = componentDbTester.insertPrivateProjectDto(organization); userSession.logIn().addProjectPermission(ADMIN, project); WebhookDto dto1 = webhookDbTester.insertWebhook(project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/UpdateActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/UpdateActionTest.java index 5150650d694..85180cf8183 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/UpdateActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/UpdateActionTest.java @@ -27,11 +27,12 @@ import org.sonar.api.server.ws.WebService; import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDbTester; -import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDbTester; import org.sonar.db.organization.OrganizationDto; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDbTester; import org.sonar.db.webhook.WebhookDto; +import org.sonar.server.component.ComponentFinder; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.exceptions.UnauthorizedException; @@ -70,7 +71,8 @@ public class UpdateActionTest { private DefaultOrganizationProvider defaultOrganizationProvider = from(db); private WebhookSupport webhookSupport = new WebhookSupport(userSession); - private UpdateAction underTest = new UpdateAction(dbClient, userSession, webhookSupport); + private ComponentFinder componentFinder = new ComponentFinder(dbClient, null); + private UpdateAction underTest = new UpdateAction(dbClient, userSession, webhookSupport, componentFinder); private WsActionTester wsActionTester = new WsActionTester(underTest); @Test @@ -91,7 +93,7 @@ public class UpdateActionTest { @Test public void update_a_project_webhook_with_required_fields() { - ComponentDto project = componentDbTester.insertPrivateProject(); + ProjectDto project = componentDbTester.insertPrivateProjectDto(); WebhookDto dto = webhookDbTester.insertWebhook(project); userSession.logIn().addProjectPermission(ADMIN, project); @@ -113,7 +115,7 @@ public class UpdateActionTest { @Test public void update_a_project_webhook_with_all_fields() { - ComponentDto project = componentDbTester.insertPrivateProject(); + ProjectDto project = componentDbTester.insertPrivateProjectDto(); WebhookDto dto = webhookDbTester.insertWebhook(project); userSession.logIn().addProjectPermission(ADMIN, project); @@ -188,7 +190,7 @@ public class UpdateActionTest { @Test public void fail_if_no_permission_on_webhook_scope_project() { - ComponentDto project = componentDbTester.insertPrivateProject(); + ProjectDto project = componentDbTester.insertPrivateProjectDto(); WebhookDto dto = webhookDbTester.insertWebhook(project); userSession.logIn(); @@ -222,7 +224,7 @@ public class UpdateActionTest { @Test public void fail_if_url_is_not_valid() { - ComponentDto project = componentDbTester.insertPrivateProject(); + ProjectDto project = componentDbTester.insertPrivateProjectDto(); WebhookDto dto = webhookDbTester.insertWebhook(project); userSession.logIn().addProjectPermission(ADMIN, project); @@ -237,7 +239,7 @@ public class UpdateActionTest { @Test public void fail_if_credential_in_url_is_have_a_wrong_format() { - ComponentDto project = componentDbTester.insertPrivateProject(); + ProjectDto project = componentDbTester.insertPrivateProjectDto(); WebhookDto dto = webhookDbTester.insertWebhook(project); userSession.logIn().addProjectPermission(ADMIN, project); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionTest.java index fa3628c5914..00346d79ebc 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionTest.java @@ -66,7 +66,7 @@ public class WebhookDeliveriesActionTest { ComponentFinder componentFinder = TestComponentFinder.from(db); WebhookDeliveriesAction underTest = new WebhookDeliveriesAction(dbClient, userSession, componentFinder); ws = new WsActionTester(underTest); - project = db.components().insertComponent(newPrivateProjectDto(db.organizations().insert()).setDbKey("my-project")); + project = db.components().insertPrivateProject(c -> c.setDbKey("my-project")); } @Test diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveryActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveryActionTest.java index 59d9e8363dd..b1dc427ebd4 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveryActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/webhook/ws/WebhookDeliveryActionTest.java @@ -30,6 +30,7 @@ import org.sonar.db.DbClient; import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentTesting; +import org.sonar.db.project.ProjectDto; import org.sonar.db.webhook.WebhookDeliveryDto; import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.TestComponentFinder; @@ -65,7 +66,7 @@ public class WebhookDeliveryActionTest { ComponentFinder componentFinder = TestComponentFinder.from(db); WebhookDeliveryAction underTest = new WebhookDeliveryAction(dbClient, userSession, componentFinder); ws = new WsActionTester(underTest); - project = db.components().insertComponent(ComponentTesting.newPrivateProjectDto(db.organizations().insert()).setDbKey("my-project")); + project = db.components().insertPrivateProject(c -> c.setDbKey("my-project")); } @Test diff --git a/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud/no_author_and_no_authors_facet.json b/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud/no_author_and_no_authors_facet.json deleted file mode 100644 index 8f82c809391..00000000000 --- a/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud/no_author_and_no_authors_facet.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "total": 2, - "p": 1, - "issues": [ - { - "organization": "org-1", - "key": "82fd47d4-b650-4037-80bc-7b1182fd47d4", - "rule": "xoo:x1", - "component": "FK1", - "project": "PK1" - }, - { - "organization": "org-1", - "key": "2bd4eac2-b650-4037-80bc-7b112bd4eac2", - "rule": "xoo:x1", - "component": "FK1", - "project": "PK1" - } - ] -} diff --git a/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud/no_authors_facet.json b/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud/no_authors_facet.json deleted file mode 100644 index c8df191b11b..00000000000 --- a/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud/no_authors_facet.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "total": 2, - "p": 1, - "issues": [ - { - "organization": "org-1", - "key": "82fd47d4-b650-4037-80bc-7b1182fd47d4", - "rule": "xoo:x1", - "component": "FK1", - "project": "PK1", - "author": "luke@skywalker.name" - }, - { - "organization": "org-1", - "key": "2bd4eac2-b650-4037-80bc-7b112bd4eac2", - "rule": "xoo:x1", - "component": "FK1", - "project": "PK1", - "author": "leia" - } - ] -} diff --git a/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud/with_authors_facet.json b/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud/with_authors_facet.json deleted file mode 100644 index cf2a13cb94d..00000000000 --- a/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud/with_authors_facet.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "total": 2, - "p": 1, - "issues": [ - { - "organization": "org-1", - "key": "82fd47d4-b650-4037-80bc-7b1182fd47d4", - "rule": "xoo:x1", - "component": "FK1", - "project": "PK1", - "author": "luke@skywalker.name" - }, - { - "organization": "org-1", - "key": "2bd4eac2-b650-4037-80bc-7b112bd4eac2", - "rule": "xoo:x1", - "component": "FK1", - "project": "PK1", - "author": "leia" - } - ], - "facets": [ - { - "property": "authors", - "values": [ - { - "val": "leia", - "count": 1 - }, - { - "val": "luke@skywalker.name", - "count": 1 - } - ] - } - ] -} |