You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ComponentDbTester.java 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2021 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.db.component;
  21. import java.util.Arrays;
  22. import java.util.function.Consumer;
  23. import javax.annotation.Nullable;
  24. import org.sonar.api.resources.Qualifiers;
  25. import org.sonar.api.utils.System2;
  26. import org.sonar.db.DbClient;
  27. import org.sonar.db.DbSession;
  28. import org.sonar.db.DbTester;
  29. import org.sonar.db.project.ProjectDto;
  30. import static com.google.common.base.Preconditions.checkArgument;
  31. import static com.google.common.base.Preconditions.checkState;
  32. import static java.util.Arrays.asList;
  33. import static org.sonar.db.component.BranchType.BRANCH;
  34. public class ComponentDbTester {
  35. private final DbTester db;
  36. private final DbClient dbClient;
  37. private final DbSession dbSession;
  38. public ComponentDbTester(DbTester db) {
  39. this.db = db;
  40. this.dbClient = db.getDbClient();
  41. this.dbSession = db.getSession();
  42. }
  43. public SnapshotDto insertProjectAndSnapshot(ComponentDto component) {
  44. insertComponentAndBranchAndProject(component, null, defaults(), defaults(), defaults());
  45. return insertSnapshot(component);
  46. }
  47. public SnapshotDto insertViewAndSnapshot(ComponentDto component) {
  48. dbClient.componentDao().insert(dbSession, component);
  49. return insertSnapshot(component);
  50. }
  51. public ComponentDto insertComponent(ComponentDto component) {
  52. return insertComponentImpl(component, null, defaults());
  53. }
  54. public ComponentDto insertPrivateProject() {
  55. return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(), true,
  56. defaults(), defaults(), defaults());
  57. }
  58. public ProjectDto getProjectDto(ComponentDto project) {
  59. return db.getDbClient().projectDao().selectByUuid(dbSession, project.uuid())
  60. .orElseThrow(() -> new IllegalStateException("Project has invalid configuration"));
  61. }
  62. public ComponentDto insertPrivateProject(ComponentDto componentDto) {
  63. return insertComponentAndBranchAndProject(componentDto, true);
  64. }
  65. public ComponentDto insertPublicProject() {
  66. return insertComponentAndBranchAndProject(ComponentTesting.newPublicProjectDto(), false);
  67. }
  68. public ComponentDto insertPublicProject(String uuid) {
  69. return insertComponentAndBranchAndProject(ComponentTesting.newPublicProjectDto(uuid), false);
  70. }
  71. public ComponentDto insertPublicProject(ComponentDto componentDto) {
  72. return insertComponentAndBranchAndProject(componentDto, false);
  73. }
  74. public ComponentDto insertPrivateProject(String uuid) {
  75. return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(uuid), true);
  76. }
  77. public final ComponentDto insertPrivateProject(Consumer<ComponentDto> dtoPopulator) {
  78. return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(), true, defaults(),
  79. dtoPopulator);
  80. }
  81. public final ComponentDto insertPrivateProject(Consumer<ComponentDto> componentDtoPopulator, Consumer<ProjectDto> projectDtoPopulator) {
  82. return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(),
  83. true, defaults(), componentDtoPopulator, projectDtoPopulator);
  84. }
  85. public final ComponentDto insertPublicProject(Consumer<ComponentDto> dtoPopulator) {
  86. return insertComponentAndBranchAndProject(ComponentTesting.newPublicProjectDto(), false, defaults(),
  87. dtoPopulator);
  88. }
  89. public final ComponentDto insertPublicProject(Consumer<ComponentDto> componentDtoPopulator, Consumer<ProjectDto> projectDtoPopulator) {
  90. return insertComponentAndBranchAndProject(ComponentTesting.newPublicProjectDto(), false, defaults(), componentDtoPopulator,
  91. projectDtoPopulator);
  92. }
  93. public ProjectDto insertPublicProjectDto() {
  94. ComponentDto componentDto = insertPublicProject();
  95. return getProjectDto(componentDto);
  96. }
  97. public ProjectDto insertPrivateProjectDto() {
  98. ComponentDto componentDto = insertPrivateProject();
  99. return getProjectDto(componentDto);
  100. }
  101. public ProjectDto insertPublicProjectDto(Consumer<ComponentDto> dtoPopulator) {
  102. ComponentDto componentDto = insertPublicProject(dtoPopulator);
  103. return getProjectDto(componentDto);
  104. }
  105. public final ProjectDto insertPrivateProjectDto(Consumer<ComponentDto> componentDtoPopulator) {
  106. return insertPrivateProjectDto(componentDtoPopulator, defaults());
  107. }
  108. public final ProjectDto insertPrivateProjectDto(Consumer<ComponentDto> componentDtoPopulator, Consumer<ProjectDto> projectDtoPopulator) {
  109. ComponentDto componentDto = insertPrivateProject(componentDtoPopulator, projectDtoPopulator);
  110. return getProjectDto(componentDto);
  111. }
  112. public ProjectDto insertPrivateProjectDto(Consumer<BranchDto> branchPopulator, Consumer<ComponentDto> componentDtoPopulator,
  113. Consumer<ProjectDto> projectDtoPopulator) {
  114. ComponentDto componentDto = insertPrivateProjectWithCustomBranch(branchPopulator, componentDtoPopulator, projectDtoPopulator);
  115. return getProjectDto(componentDto);
  116. }
  117. public final ComponentDto insertPrivateProject(String uuid, Consumer<ComponentDto> dtoPopulator) {
  118. return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(uuid), true, defaults(), dtoPopulator);
  119. }
  120. public final ComponentDto insertPrivateProjectWithCustomBranch(String branchKey) {
  121. return insertPrivateProjectWithCustomBranch(b -> b.setBranchType(BRANCH).setKey(branchKey), defaults());
  122. }
  123. public final ComponentDto insertPrivateProjectWithCustomBranch(Consumer<BranchDto> branchPopulator, Consumer<ComponentDto> componentPopulator) {
  124. return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(), true, branchPopulator, componentPopulator);
  125. }
  126. public final ComponentDto insertPrivateProjectWithCustomBranch(Consumer<BranchDto> branchPopulator, Consumer<ComponentDto> componentPopulator,
  127. Consumer<ProjectDto> projectPopulator) {
  128. return insertComponentAndBranchAndProject(ComponentTesting.newPrivateProjectDto(), true, branchPopulator, componentPopulator, projectPopulator);
  129. }
  130. public final ComponentDto insertPublicPortfolio() {
  131. return insertPublicPortfolio(defaults());
  132. }
  133. public final ComponentDto insertPublicPortfolio(String uuid, Consumer<ComponentDto> dtoPopulator) {
  134. return insertComponentImpl(ComponentTesting.newView(uuid).setPrivate(false), false, dtoPopulator);
  135. }
  136. public final ComponentDto insertPublicPortfolio(Consumer<ComponentDto> dtoPopulator) {
  137. return insertComponentImpl(ComponentTesting.newView().setPrivate(false), false, dtoPopulator);
  138. }
  139. public final ComponentDto insertPrivatePortfolio() {
  140. return insertComponentImpl(ComponentTesting.newView().setPrivate(true), true, defaults());
  141. }
  142. public final ComponentDto insertPrivatePortfolio(String uuid, Consumer<ComponentDto> dtoPopulator) {
  143. return insertComponentImpl(ComponentTesting.newView(uuid).setPrivate(true), true, dtoPopulator);
  144. }
  145. public final ComponentDto insertPrivatePortfolio(Consumer<ComponentDto> dtoPopulator) {
  146. return insertComponentImpl(ComponentTesting.newView().setPrivate(true), true, dtoPopulator);
  147. }
  148. public final ComponentDto insertPublicApplication() {
  149. return insertPublicApplication(defaults());
  150. }
  151. public final ComponentDto insertPublicApplication(Consumer<ComponentDto> dtoPopulator) {
  152. return insertComponentAndBranchAndProject(ComponentTesting.newApplication().setPrivate(false), false, defaults(), dtoPopulator);
  153. }
  154. public final ProjectDto insertPrivateApplicationDto() {
  155. return getProjectDto(insertPrivateApplication());
  156. }
  157. public final ProjectDto insertPublicApplicationDto() {
  158. return getProjectDto(insertPublicApplication());
  159. }
  160. public final ProjectDto insertPrivateApplicationDto(Consumer<ComponentDto> dtoPopulator) {
  161. return getProjectDto(insertPrivateApplication(dtoPopulator, defaults()));
  162. }
  163. public final ProjectDto insertPrivateApplicationDto(Consumer<ComponentDto> dtoPopulator, Consumer<ProjectDto> appPopulator) {
  164. return getProjectDto(insertPrivateApplication(dtoPopulator, appPopulator));
  165. }
  166. public final ComponentDto insertPrivateApplication(Consumer<ComponentDto> dtoPopulator) {
  167. return insertPrivateApplication(dtoPopulator, defaults());
  168. }
  169. public final ComponentDto insertPrivateApplication() {
  170. return insertPrivateApplication(defaults(), defaults());
  171. }
  172. public final ComponentDto insertPrivateApplication(Consumer<ComponentDto> dtoPopulator, Consumer<ProjectDto> projectPopulator) {
  173. return insertComponentAndBranchAndProject(ComponentTesting.newApplication().setPrivate(true), true, defaults(), dtoPopulator, projectPopulator);
  174. }
  175. public final ComponentDto insertSubView(ComponentDto view) {
  176. return insertSubView(view, defaults());
  177. }
  178. public final ComponentDto insertSubView(ComponentDto view, Consumer<ComponentDto> dtoPopulator) {
  179. return insertComponentAndBranchAndProject(ComponentTesting.newSubView(view), view.isPrivate(), defaults(), dtoPopulator);
  180. }
  181. private ComponentDto insertComponentAndBranchAndProject(ComponentDto component, @Nullable Boolean isPrivate, Consumer<BranchDto> branchPopulator,
  182. Consumer<ComponentDto> componentDtoPopulator, Consumer<ProjectDto> projectDtoPopulator) {
  183. insertComponentImpl(component, isPrivate, componentDtoPopulator);
  184. ProjectDto projectDto = toProjectDto(component, System2.INSTANCE.now());
  185. projectDtoPopulator.accept(projectDto);
  186. dbClient.projectDao().insert(dbSession, projectDto);
  187. BranchDto branchDto = ComponentTesting.newBranchDto(component, BRANCH);
  188. branchDto.setExcludeFromPurge(true);
  189. branchPopulator.accept(branchDto);
  190. dbClient.branchDao().insert(dbSession, branchDto);
  191. db.commit();
  192. return component;
  193. }
  194. public void addApplicationProject(ComponentDto application, ComponentDto... projects) {
  195. for (ComponentDto project : projects) {
  196. dbClient.applicationProjectsDao().addProject(dbSession, application.uuid(), project.uuid());
  197. }
  198. db.commit();
  199. }
  200. public void addApplicationProject(ProjectDto application, ProjectDto... projects) {
  201. for (ProjectDto project : projects) {
  202. dbClient.applicationProjectsDao().addProject(dbSession, application.getUuid(), project.getUuid());
  203. }
  204. db.commit();
  205. }
  206. public void addProjectBranchToApplicationBranch(BranchDto applicationBranch, BranchDto... projectBranches) {
  207. for (BranchDto projectBranch : projectBranches) {
  208. dbClient.applicationProjectsDao().addProjectBranchToAppBranch(dbSession, applicationBranch, projectBranch);
  209. }
  210. db.commit();
  211. }
  212. private ComponentDto insertComponentAndBranchAndProject(ComponentDto component, @Nullable Boolean isPrivate, Consumer<BranchDto> branchPopulator,
  213. Consumer<ComponentDto> componentDtoPopulator) {
  214. return insertComponentAndBranchAndProject(component, isPrivate, branchPopulator, componentDtoPopulator, defaults());
  215. }
  216. private ComponentDto insertComponentAndBranchAndProject(ComponentDto component, @Nullable Boolean isPrivate, Consumer<BranchDto> branchPopulator) {
  217. return insertComponentAndBranchAndProject(component, isPrivate, branchPopulator, defaults());
  218. }
  219. private ComponentDto insertComponentAndBranchAndProject(ComponentDto component, @Nullable Boolean isPrivate) {
  220. return insertComponentAndBranchAndProject(component, isPrivate, defaults());
  221. }
  222. private ComponentDto insertComponentImpl(ComponentDto component, @Nullable Boolean isPrivate, Consumer<ComponentDto> dtoPopulator) {
  223. dtoPopulator.accept(component);
  224. checkState(isPrivate == null || component.isPrivate() == isPrivate, "Illegal modification of private flag");
  225. dbClient.componentDao().insert(dbSession, component);
  226. db.commit();
  227. return component;
  228. }
  229. public void insertComponents(ComponentDto... components) {
  230. dbClient.componentDao().insert(dbSession, asList(components));
  231. db.commit();
  232. }
  233. public SnapshotDto insertSnapshot(SnapshotDto snapshotDto) {
  234. SnapshotDto snapshot = dbClient.snapshotDao().insert(dbSession, snapshotDto);
  235. db.commit();
  236. return snapshot;
  237. }
  238. public SnapshotDto insertSnapshot(ComponentDto componentDto) {
  239. return insertSnapshot(componentDto, defaults());
  240. }
  241. public SnapshotDto insertSnapshot(ComponentDto componentDto, Consumer<SnapshotDto> consumer) {
  242. SnapshotDto snapshotDto = SnapshotTesting.newAnalysis(componentDto);
  243. consumer.accept(snapshotDto);
  244. return insertSnapshot(snapshotDto);
  245. }
  246. public SnapshotDto insertSnapshot(BranchDto branchDto) {
  247. return insertSnapshot(branchDto, defaults());
  248. }
  249. public SnapshotDto insertSnapshot(ProjectDto project) {
  250. return insertSnapshot(project, defaults());
  251. }
  252. public SnapshotDto insertSnapshot(ProjectDto project, Consumer<SnapshotDto> consumer) {
  253. SnapshotDto snapshotDto = SnapshotTesting.newAnalysis(project.getUuid());
  254. consumer.accept(snapshotDto);
  255. return insertSnapshot(snapshotDto);
  256. }
  257. public SnapshotDto insertSnapshot(BranchDto branchDto, Consumer<SnapshotDto> consumer) {
  258. SnapshotDto snapshotDto = SnapshotTesting.newAnalysis(branchDto);
  259. consumer.accept(snapshotDto);
  260. return insertSnapshot(snapshotDto);
  261. }
  262. public void insertSnapshots(SnapshotDto... snapshotDtos) {
  263. dbClient.snapshotDao().insert(dbSession, asList(snapshotDtos));
  264. db.commit();
  265. }
  266. @SafeVarargs
  267. public final ComponentDto insertProjectBranch(ComponentDto project, Consumer<BranchDto>... dtoPopulators) {
  268. // MainBranchProjectUuid will be null if it's a main branch
  269. BranchDto branchDto = ComponentTesting.newBranchDto(firstNonNull(project.getMainBranchProjectUuid(), project.projectUuid()), BRANCH);
  270. Arrays.stream(dtoPopulators).forEach(dtoPopulator -> dtoPopulator.accept(branchDto));
  271. return insertProjectBranch(project, branchDto);
  272. }
  273. @SafeVarargs
  274. public final BranchDto insertProjectBranch(ProjectDto project, Consumer<BranchDto>... dtoPopulators) {
  275. BranchDto branchDto = ComponentTesting.newBranchDto(project.getUuid(), BRANCH);
  276. Arrays.stream(dtoPopulators).forEach(dtoPopulator -> dtoPopulator.accept(branchDto));
  277. insertProjectBranch(project, branchDto);
  278. return branchDto;
  279. }
  280. public final ComponentDto insertProjectBranch(ProjectDto project, BranchDto branchDto) {
  281. checkArgument(branchDto.getProjectUuid().equals(project.getUuid()));
  282. ComponentDto branch = ComponentTesting.newBranchComponent(project, branchDto);
  283. insertComponent(branch);
  284. dbClient.branchDao().insert(dbSession, branchDto);
  285. db.commit();
  286. return branch;
  287. }
  288. public final ComponentDto insertProjectBranch(ComponentDto project, BranchDto branchDto) {
  289. // MainBranchProjectUuid will be null if it's a main branch
  290. checkArgument(branchDto.getProjectUuid().equals(firstNonNull(project.getMainBranchProjectUuid(), project.projectUuid())));
  291. ComponentDto branch = ComponentTesting.newBranchComponent(project, branchDto);
  292. insertComponent(branch);
  293. dbClient.branchDao().insert(dbSession, branchDto);
  294. db.commit();
  295. return branch;
  296. }
  297. private static <T> T firstNonNull(@Nullable T first, T second) {
  298. return (first != null) ? first : second;
  299. }
  300. // TODO temporary constructor to quickly create project from previous project component.
  301. public static ProjectDto toProjectDto(ComponentDto componentDto, long createTime) {
  302. return new ProjectDto()
  303. .setUuid(componentDto.uuid())
  304. .setKey(componentDto.getDbKey())
  305. .setQualifier(componentDto.qualifier() != null ? componentDto.qualifier() : Qualifiers.PROJECT)
  306. .setCreatedAt(createTime)
  307. .setUpdatedAt(createTime)
  308. .setPrivate(componentDto.isPrivate())
  309. .setDescription(componentDto.description())
  310. .setName(componentDto.name());
  311. }
  312. private static <T> Consumer<T> defaults() {
  313. return t -> {
  314. };
  315. }
  316. }