diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersister.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersister.java index 7c3764bac7c5..b63b8c49811e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersister.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersister.java @@ -19,87 +19,9 @@ */ package org.sonar.server.computation.task.projectanalysis.component; -import java.util.Date; -import javax.annotation.Nullable; -import org.sonar.api.utils.System2; -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.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder; -import org.sonar.server.computation.task.projectanalysis.analysis.Branch; -import static org.sonar.db.component.ComponentDto.UUID_PATH_OF_ROOT; -import static org.sonar.db.component.ComponentDto.UUID_PATH_SEPARATOR; +public interface BranchPersister { -public class BranchPersister { - private final DbClient dbClient; - private final System2 system2; - private final TreeRootHolder treeRootHolder; - private final AnalysisMetadataHolder analysisMetadataHolder; - - public BranchPersister(DbClient dbClient, System2 system2, TreeRootHolder treeRootHolder, AnalysisMetadataHolder analysisMetadataHolder) { - this.dbClient = dbClient; - this.system2 = system2; - this.treeRootHolder = treeRootHolder; - this.analysisMetadataHolder = analysisMetadataHolder; - } - - public void persist(DbSession dbSession) { - Branch branch = analysisMetadataHolder.getBranch(); - String branchUuid = treeRootHolder.getRoot().getUuid(); - - com.google.common.base.Optional branchComponentDtoOpt = dbClient.componentDao().selectByUuid(dbSession, branchUuid); - - ComponentDto branchComponentDto; - if (branch.isMain()) { - checkState(branchComponentDtoOpt.isPresent(), "Project has been deleted by end-user during analysis"); - branchComponentDto = branchComponentDtoOpt.get(); - - } else { - // inserts new row in table projects if it's the first time branch is analyzed - branchComponentDto = branchComponentDtoOpt.or(() -> insertIntoProjectsTable(dbSession, branchUuid)); - - } - // insert or update in table project_branches - dbClient.branchDao().upsert(dbSession, toBranchDto(branchComponentDto, branch)); - } - - private static void checkState(boolean condition, String msg) { - if (!condition) { - throw new IllegalStateException(msg); - } - } - - private static T firstNonNull(@Nullable T first, T second) { - return (first != null) ? first : second; - } - - private static BranchDto toBranchDto(ComponentDto componentDto, Branch branch) { - BranchDto dto = new BranchDto(); - dto.setUuid(componentDto.uuid()); - // MainBranchProjectUuid will be null if it's a main branch - dto.setProjectUuid(firstNonNull(componentDto.getMainBranchProjectUuid(), componentDto.projectUuid())); - dto.setKey(branch.getName()); - dto.setBranchType(branch.getType()); - // merge branch is only present if it's a short living branch - dto.setMergeBranchUuid(branch.getMergeBranchUuid().orElse(null)); - return dto; - } - - private ComponentDto insertIntoProjectsTable(DbSession dbSession, String branchUuid) { - String mainBranchProjectUuid = analysisMetadataHolder.getProject().getUuid(); - ComponentDto project = dbClient.componentDao().selectOrFailByUuid(dbSession, mainBranchProjectUuid); - ComponentDto branchDto = project.copy(); - branchDto.setUuid(branchUuid); - branchDto.setProjectUuid(branchUuid); - branchDto.setRootUuid(branchUuid); - branchDto.setUuidPath(UUID_PATH_OF_ROOT); - branchDto.setModuleUuidPath(UUID_PATH_SEPARATOR + branchUuid + UUID_PATH_SEPARATOR); - branchDto.setMainBranchProjectUuid(mainBranchProjectUuid); - branchDto.setDbKey(treeRootHolder.getRoot().getKey()); - branchDto.setCreatedAt(new Date(system2.now())); - dbClient.componentDao().insert(dbSession, branchDto); - return branchDto; - } + void persist(DbSession dbSession); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersisterImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersisterImpl.java new file mode 100644 index 000000000000..8a159a7ad50b --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersisterImpl.java @@ -0,0 +1,105 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 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.computation.task.projectanalysis.component; + +import java.util.Date; +import javax.annotation.Nullable; +import org.sonar.api.utils.System2; +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.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder; +import org.sonar.server.computation.task.projectanalysis.analysis.Branch; + +import static org.sonar.db.component.ComponentDto.UUID_PATH_OF_ROOT; +import static org.sonar.db.component.ComponentDto.UUID_PATH_SEPARATOR; + +public class BranchPersisterImpl implements BranchPersister { + private final DbClient dbClient; + private final System2 system2; + private final TreeRootHolder treeRootHolder; + private final AnalysisMetadataHolder analysisMetadataHolder; + + public BranchPersisterImpl(DbClient dbClient, System2 system2, TreeRootHolder treeRootHolder, AnalysisMetadataHolder analysisMetadataHolder) { + this.dbClient = dbClient; + this.system2 = system2; + this.treeRootHolder = treeRootHolder; + this.analysisMetadataHolder = analysisMetadataHolder; + } + + public void persist(DbSession dbSession) { + Branch branch = analysisMetadataHolder.getBranch(); + String branchUuid = treeRootHolder.getRoot().getUuid(); + + com.google.common.base.Optional branchComponentDtoOpt = dbClient.componentDao().selectByUuid(dbSession, branchUuid); + + ComponentDto branchComponentDto; + if (branch.isMain()) { + checkState(branchComponentDtoOpt.isPresent(), "Project has been deleted by end-user during analysis"); + branchComponentDto = branchComponentDtoOpt.get(); + + } else { + // inserts new row in table projects if it's the first time branch is analyzed + branchComponentDto = branchComponentDtoOpt.or(() -> insertIntoProjectsTable(dbSession, branchUuid)); + + } + // insert or update in table project_branches + dbClient.branchDao().upsert(dbSession, toBranchDto(branchComponentDto, branch)); + } + + private static void checkState(boolean condition, String msg) { + if (!condition) { + throw new IllegalStateException(msg); + } + } + + private static T firstNonNull(@Nullable T first, T second) { + return (first != null) ? first : second; + } + + private static BranchDto toBranchDto(ComponentDto componentDto, Branch branch) { + BranchDto dto = new BranchDto(); + dto.setUuid(componentDto.uuid()); + // MainBranchProjectUuid will be null if it's a main branch + dto.setProjectUuid(firstNonNull(componentDto.getMainBranchProjectUuid(), componentDto.projectUuid())); + dto.setKey(branch.getName()); + dto.setBranchType(branch.getType()); + // merge branch is only present if it's a short living branch + dto.setMergeBranchUuid(branch.getMergeBranchUuid().orElse(null)); + return dto; + } + + private ComponentDto insertIntoProjectsTable(DbSession dbSession, String branchUuid) { + String mainBranchProjectUuid = analysisMetadataHolder.getProject().getUuid(); + ComponentDto project = dbClient.componentDao().selectOrFailByUuid(dbSession, mainBranchProjectUuid); + ComponentDto branchDto = project.copy(); + branchDto.setUuid(branchUuid); + branchDto.setProjectUuid(branchUuid); + branchDto.setRootUuid(branchUuid); + branchDto.setUuidPath(UUID_PATH_OF_ROOT); + branchDto.setModuleUuidPath(UUID_PATH_SEPARATOR + branchUuid + UUID_PATH_SEPARATOR); + branchDto.setMainBranchProjectUuid(mainBranchProjectUuid); + branchDto.setDbKey(treeRootHolder.getRoot().getKey()); + branchDto.setCreatedAt(new Date(system2.now())); + dbClient.componentDao().insert(dbSession, branchDto); + return branchDto; + } +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java index a68aa9e53403..6c49120776fd 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/container/ProjectAnalysisTaskContainerPopulator.java @@ -34,7 +34,7 @@ import org.sonar.server.computation.task.projectanalysis.batch.BatchReportDirectoryHolderImpl; import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReaderImpl; import org.sonar.server.computation.task.projectanalysis.component.BranchLoader; -import org.sonar.server.computation.task.projectanalysis.component.BranchPersister; +import org.sonar.server.computation.task.projectanalysis.component.BranchPersisterImpl; import org.sonar.server.computation.task.projectanalysis.component.ConfigurationRepositoryImpl; import org.sonar.server.computation.task.projectanalysis.component.DbIdsRepositoryImpl; import org.sonar.server.computation.task.projectanalysis.component.DisabledComponentsHolderImpl; @@ -64,7 +64,6 @@ import org.sonar.server.computation.task.projectanalysis.issue.IssueCounter; import org.sonar.server.computation.task.projectanalysis.issue.IssueCreationDateCalculator; import org.sonar.server.computation.task.projectanalysis.issue.IssueLifecycle; -import org.sonar.server.computation.task.projectanalysis.issue.ShortBranchIssueMerger; import org.sonar.server.computation.task.projectanalysis.issue.IssueTrackingDelegator; import org.sonar.server.computation.task.projectanalysis.issue.IssueVisitors; import org.sonar.server.computation.task.projectanalysis.issue.IssuesRepositoryVisitor; @@ -73,12 +72,13 @@ import org.sonar.server.computation.task.projectanalysis.issue.MovedIssueVisitor; import org.sonar.server.computation.task.projectanalysis.issue.NewEffortAggregator; import org.sonar.server.computation.task.projectanalysis.issue.RemoveProcessedComponentsVisitor; -import org.sonar.server.computation.task.projectanalysis.issue.ShortBranchIssuesLoader; import org.sonar.server.computation.task.projectanalysis.issue.RuleRepositoryImpl; import org.sonar.server.computation.task.projectanalysis.issue.RuleTagsCopier; import org.sonar.server.computation.task.projectanalysis.issue.RuleTypeCopier; import org.sonar.server.computation.task.projectanalysis.issue.ScmAccountToUser; import org.sonar.server.computation.task.projectanalysis.issue.ScmAccountToUserLoader; +import org.sonar.server.computation.task.projectanalysis.issue.ShortBranchIssueMerger; +import org.sonar.server.computation.task.projectanalysis.issue.ShortBranchIssuesLoader; import org.sonar.server.computation.task.projectanalysis.issue.ShortBranchTrackerExecution; import org.sonar.server.computation.task.projectanalysis.issue.TrackerBaseInputFactory; import org.sonar.server.computation.task.projectanalysis.issue.TrackerExecution; @@ -251,7 +251,7 @@ private static List componentClasses() { ComponentIssuesLoader.class, BaseIssuesLoader.class, IssueTrackingDelegator.class, - BranchPersister.class, + BranchPersisterImpl.class, ShortBranchIssuesLoader.class, ShortBranchIssueMerger.class, diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersisterTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersisterImplTest.java similarity index 95% rename from server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersisterTest.java rename to server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersisterImplTest.java index 3bb6b653b72a..492b535223d1 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersisterTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/component/BranchPersisterImplTest.java @@ -38,7 +38,7 @@ import static org.sonar.server.computation.task.projectanalysis.component.Component.Type.PROJECT; import static org.sonar.server.computation.task.projectanalysis.component.ReportComponent.builder; -public class BranchPersisterTest { +public class BranchPersisterImplTest { private final static Component MAIN = builder(PROJECT, 1).setUuid("PROJECT_UUID").setKey("PROJECT_KEY").build(); private final static Component BRANCH = builder(PROJECT, 1).setUuid("BRANCH_UUID").setKey("BRANCH_KEY").build(); @@ -51,7 +51,7 @@ public class BranchPersisterTest { @Rule public ExpectedException exception = ExpectedException.none(); - BranchPersister underTest = new BranchPersister(dbTester.getDbClient(), System2.INSTANCE, treeRootHolder, analysisMetadataHolder); + BranchPersister underTest = new BranchPersisterImpl(dbTester.getDbClient(), System2.INSTANCE, treeRootHolder, analysisMetadataHolder); @Test public void fail_if_no_component_for_main_branches() {