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.

ProjectAnalysisTaskContainerPopulator.java 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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.ce.task.projectanalysis.container;
  21. import java.util.Arrays;
  22. import java.util.List;
  23. import javax.annotation.Nullable;
  24. import org.sonar.ce.task.CeTask;
  25. import org.sonar.ce.task.container.TaskContainer;
  26. import org.sonar.ce.task.log.CeTaskMessagesImpl;
  27. import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderImpl;
  28. import org.sonar.ce.task.projectanalysis.api.posttask.PostProjectAnalysisTasksExecutor;
  29. import org.sonar.ce.task.projectanalysis.batch.BatchReportDirectoryHolderImpl;
  30. import org.sonar.ce.task.projectanalysis.batch.BatchReportReaderImpl;
  31. import org.sonar.ce.task.projectanalysis.component.BranchLoader;
  32. import org.sonar.ce.task.projectanalysis.component.BranchPersisterImpl;
  33. import org.sonar.ce.task.projectanalysis.component.ConfigurationRepositoryImpl;
  34. import org.sonar.ce.task.projectanalysis.component.DisabledComponentsHolderImpl;
  35. import org.sonar.ce.task.projectanalysis.period.NewCodeReferenceBranchComponentUuids;
  36. import org.sonar.ce.task.projectanalysis.component.ProjectPersister;
  37. import org.sonar.ce.task.projectanalysis.component.ReferenceBranchComponentUuids;
  38. import org.sonar.ce.task.projectanalysis.component.ReportModulesPath;
  39. import org.sonar.ce.task.projectanalysis.component.SiblingComponentsWithOpenIssues;
  40. import org.sonar.ce.task.projectanalysis.component.TreeRootHolderImpl;
  41. import org.sonar.ce.task.projectanalysis.duplication.CrossProjectDuplicationStatusHolderImpl;
  42. import org.sonar.ce.task.projectanalysis.duplication.DuplicationMeasures;
  43. import org.sonar.ce.task.projectanalysis.duplication.DuplicationRepositoryImpl;
  44. import org.sonar.ce.task.projectanalysis.duplication.IntegrateCrossProjectDuplications;
  45. import org.sonar.ce.task.projectanalysis.event.EventRepositoryImpl;
  46. import org.sonar.ce.task.projectanalysis.filemove.AddedFileRepositoryImpl;
  47. import org.sonar.ce.task.projectanalysis.filemove.FileSimilarityImpl;
  48. import org.sonar.ce.task.projectanalysis.filemove.MutableMovedFilesRepositoryImpl;
  49. import org.sonar.ce.task.projectanalysis.filemove.ScoreMatrixDumperImpl;
  50. import org.sonar.ce.task.projectanalysis.filemove.SourceSimilarityImpl;
  51. import org.sonar.ce.task.projectanalysis.filesystem.ComputationTempFolderProvider;
  52. import org.sonar.ce.task.projectanalysis.issue.BaseIssuesLoader;
  53. import org.sonar.ce.task.projectanalysis.issue.CloseIssuesOnRemovedComponentsVisitor;
  54. import org.sonar.ce.task.projectanalysis.issue.ClosedIssuesInputFactory;
  55. import org.sonar.ce.task.projectanalysis.issue.ComponentIssuesLoader;
  56. import org.sonar.ce.task.projectanalysis.issue.ComponentIssuesRepositoryImpl;
  57. import org.sonar.ce.task.projectanalysis.issue.ComponentsWithUnprocessedIssues;
  58. import org.sonar.ce.task.projectanalysis.issue.DebtCalculator;
  59. import org.sonar.ce.task.projectanalysis.issue.DefaultAssignee;
  60. import org.sonar.ce.task.projectanalysis.issue.EffortAggregator;
  61. import org.sonar.ce.task.projectanalysis.issue.IntegrateIssuesVisitor;
  62. import org.sonar.ce.task.projectanalysis.issue.IssueAssigner;
  63. import org.sonar.ce.task.projectanalysis.issue.IssueCounter;
  64. import org.sonar.ce.task.projectanalysis.issue.IssueCreationDateCalculator;
  65. import org.sonar.ce.task.projectanalysis.issue.IssueLifecycle;
  66. import org.sonar.ce.task.projectanalysis.issue.IssueTrackingDelegator;
  67. import org.sonar.ce.task.projectanalysis.issue.IssueVisitors;
  68. import org.sonar.ce.task.projectanalysis.issue.IssuesRepositoryVisitor;
  69. import org.sonar.ce.task.projectanalysis.issue.LoadComponentUuidsHavingOpenIssuesVisitor;
  70. import org.sonar.ce.task.projectanalysis.issue.MovedIssueVisitor;
  71. import org.sonar.ce.task.projectanalysis.issue.NewEffortAggregator;
  72. import org.sonar.ce.task.projectanalysis.issue.ProtoIssueCache;
  73. import org.sonar.ce.task.projectanalysis.issue.PullRequestSourceBranchMerger;
  74. import org.sonar.ce.task.projectanalysis.issue.PullRequestTrackerExecution;
  75. import org.sonar.ce.task.projectanalysis.issue.ReferenceBranchTrackerExecution;
  76. import org.sonar.ce.task.projectanalysis.issue.RemoveProcessedComponentsVisitor;
  77. import org.sonar.ce.task.projectanalysis.issue.RuleRepositoryImpl;
  78. import org.sonar.ce.task.projectanalysis.issue.RuleTagsCopier;
  79. import org.sonar.ce.task.projectanalysis.issue.ScmAccountToUser;
  80. import org.sonar.ce.task.projectanalysis.issue.ScmAccountToUserLoader;
  81. import org.sonar.ce.task.projectanalysis.issue.SiblingsIssueMerger;
  82. import org.sonar.ce.task.projectanalysis.issue.SiblingsIssuesLoader;
  83. import org.sonar.ce.task.projectanalysis.issue.SourceBranchComponentUuids;
  84. import org.sonar.ce.task.projectanalysis.issue.TargetBranchComponentUuids;
  85. import org.sonar.ce.task.projectanalysis.issue.TrackerBaseInputFactory;
  86. import org.sonar.ce.task.projectanalysis.issue.TrackerExecution;
  87. import org.sonar.ce.task.projectanalysis.issue.TrackerRawInputFactory;
  88. import org.sonar.ce.task.projectanalysis.issue.TrackerReferenceBranchInputFactory;
  89. import org.sonar.ce.task.projectanalysis.issue.TrackerSourceBranchInputFactory;
  90. import org.sonar.ce.task.projectanalysis.issue.TrackerTargetBranchInputFactory;
  91. import org.sonar.ce.task.projectanalysis.issue.UpdateConflictResolver;
  92. import org.sonar.ce.task.projectanalysis.issue.commonrule.BranchCoverageRule;
  93. import org.sonar.ce.task.projectanalysis.issue.commonrule.CommentDensityRule;
  94. import org.sonar.ce.task.projectanalysis.issue.commonrule.CommonRuleEngineImpl;
  95. import org.sonar.ce.task.projectanalysis.issue.commonrule.DuplicatedBlockRule;
  96. import org.sonar.ce.task.projectanalysis.issue.commonrule.LineCoverageRule;
  97. import org.sonar.ce.task.projectanalysis.issue.commonrule.SkippedTestRule;
  98. import org.sonar.ce.task.projectanalysis.issue.commonrule.TestErrorRule;
  99. import org.sonar.ce.task.projectanalysis.issue.filter.IssueFilter;
  100. import org.sonar.ce.task.projectanalysis.language.LanguageRepositoryImpl;
  101. import org.sonar.ce.task.projectanalysis.measure.MeasureComputersHolderImpl;
  102. import org.sonar.ce.task.projectanalysis.measure.MeasureComputersVisitor;
  103. import org.sonar.ce.task.projectanalysis.measure.MeasureRepositoryImpl;
  104. import org.sonar.ce.task.projectanalysis.measure.MeasureToMeasureDto;
  105. import org.sonar.ce.task.projectanalysis.metric.MetricModule;
  106. import org.sonar.ce.task.projectanalysis.notification.NotificationFactory;
  107. import org.sonar.ce.task.projectanalysis.issue.NewIssueClassifier;
  108. import org.sonar.ce.task.projectanalysis.period.NewCodePeriodResolver;
  109. import org.sonar.ce.task.projectanalysis.period.PeriodHolderImpl;
  110. import org.sonar.ce.task.projectanalysis.qualitygate.EvaluationResultTextConverterImpl;
  111. import org.sonar.ce.task.projectanalysis.qualitygate.QualityGateHolderImpl;
  112. import org.sonar.ce.task.projectanalysis.qualitygate.QualityGateServiceImpl;
  113. import org.sonar.ce.task.projectanalysis.qualitygate.QualityGateStatusHolderImpl;
  114. import org.sonar.ce.task.projectanalysis.qualitymodel.MaintainabilityMeasuresVisitor;
  115. import org.sonar.ce.task.projectanalysis.qualitymodel.NewMaintainabilityMeasuresVisitor;
  116. import org.sonar.ce.task.projectanalysis.qualitymodel.NewReliabilityAndSecurityRatingMeasuresVisitor;
  117. import org.sonar.ce.task.projectanalysis.qualitymodel.NewSecurityReviewMeasuresVisitor;
  118. import org.sonar.ce.task.projectanalysis.qualitymodel.RatingSettings;
  119. import org.sonar.ce.task.projectanalysis.qualitymodel.ReliabilityAndSecurityRatingMeasuresVisitor;
  120. import org.sonar.ce.task.projectanalysis.qualitymodel.SecurityReviewMeasuresVisitor;
  121. import org.sonar.ce.task.projectanalysis.qualityprofile.ActiveRulesHolderImpl;
  122. import org.sonar.ce.task.projectanalysis.qualityprofile.QProfileStatusRepositoryImpl;
  123. import org.sonar.ce.task.projectanalysis.scm.ScmInfoDbLoader;
  124. import org.sonar.ce.task.projectanalysis.scm.ScmInfoRepositoryImpl;
  125. import org.sonar.ce.task.projectanalysis.source.DbLineHashVersion;
  126. import org.sonar.ce.task.projectanalysis.source.FileSourceDataComputer;
  127. import org.sonar.ce.task.projectanalysis.source.FileSourceDataWarnings;
  128. import org.sonar.ce.task.projectanalysis.source.LastCommitVisitor;
  129. import org.sonar.ce.task.projectanalysis.source.NewLinesRepository;
  130. import org.sonar.ce.task.projectanalysis.source.SignificantCodeRepository;
  131. import org.sonar.ce.task.projectanalysis.source.SourceHashRepositoryImpl;
  132. import org.sonar.ce.task.projectanalysis.source.SourceLineReadersFactory;
  133. import org.sonar.ce.task.projectanalysis.source.SourceLinesDiffImpl;
  134. import org.sonar.ce.task.projectanalysis.source.SourceLinesHashCache;
  135. import org.sonar.ce.task.projectanalysis.source.SourceLinesHashRepositoryImpl;
  136. import org.sonar.ce.task.projectanalysis.source.SourceLinesRepositoryImpl;
  137. import org.sonar.ce.task.projectanalysis.step.ReportComputationSteps;
  138. import org.sonar.ce.task.projectanalysis.step.SmallChangesetQualityGateSpecialCase;
  139. import org.sonar.ce.task.projectanalysis.webhook.WebhookPostTask;
  140. import org.sonar.ce.task.setting.SettingsLoader;
  141. import org.sonar.ce.task.step.ComputationStepExecutor;
  142. import org.sonar.ce.task.step.ComputationSteps;
  143. import org.sonar.ce.task.taskprocessor.MutableTaskResultHolderImpl;
  144. import org.sonar.core.issue.tracking.Tracker;
  145. import org.sonar.core.platform.ContainerPopulator;
  146. import org.sonar.server.setting.ProjectConfigurationLoaderImpl;
  147. import org.sonar.server.view.index.ViewIndex;
  148. public final class ProjectAnalysisTaskContainerPopulator implements ContainerPopulator<TaskContainer> {
  149. private static final ReportAnalysisComponentProvider[] NO_REPORT_ANALYSIS_COMPONENT_PROVIDERS = new ReportAnalysisComponentProvider[0];
  150. private final CeTask task;
  151. private final ReportAnalysisComponentProvider[] componentProviders;
  152. public ProjectAnalysisTaskContainerPopulator(CeTask task, @Nullable ReportAnalysisComponentProvider[] componentProviders) {
  153. this.task = task;
  154. this.componentProviders = componentProviders == null ? NO_REPORT_ANALYSIS_COMPONENT_PROVIDERS : componentProviders;
  155. }
  156. @Override
  157. public void populateContainer(TaskContainer container) {
  158. ComputationSteps steps = new ReportComputationSteps(container);
  159. container.add(SettingsLoader.class);
  160. container.add(task);
  161. container.add(steps);
  162. container.addSingletons(componentClasses());
  163. for (ReportAnalysisComponentProvider componentProvider : componentProviders) {
  164. container.addSingletons(componentProvider.getComponents());
  165. }
  166. container.addSingletons(steps.orderedStepClasses());
  167. }
  168. /**
  169. * List of all objects to be injected in the picocontainer dedicated to computation stack.
  170. * Does not contain the steps declared in {@link ReportComputationSteps#orderedStepClasses()}.
  171. */
  172. private static List<Object> componentClasses() {
  173. return Arrays.asList(
  174. ProjectConfigurationLoaderImpl.class,
  175. PostProjectAnalysisTasksExecutor.class,
  176. ComputationStepExecutor.class,
  177. // messages/warnings
  178. CeTaskMessagesImpl.class,
  179. FileSourceDataWarnings.class,
  180. // File System
  181. new ComputationTempFolderProvider(),
  182. ReportModulesPath.class,
  183. MetricModule.class,
  184. // holders
  185. AnalysisMetadataHolderImpl.class,
  186. CrossProjectDuplicationStatusHolderImpl.class,
  187. BatchReportDirectoryHolderImpl.class,
  188. TreeRootHolderImpl.class,
  189. PeriodHolderImpl.class,
  190. QualityGateHolderImpl.class,
  191. QualityGateStatusHolderImpl.class,
  192. RatingSettings.class,
  193. ActiveRulesHolderImpl.class,
  194. MeasureComputersHolderImpl.class,
  195. MutableTaskResultHolderImpl.class,
  196. BatchReportReaderImpl.class,
  197. ReferenceBranchComponentUuids.class,
  198. NewCodeReferenceBranchComponentUuids.class,
  199. SiblingComponentsWithOpenIssues.class,
  200. // repositories
  201. LanguageRepositoryImpl.class,
  202. MeasureRepositoryImpl.class,
  203. EventRepositoryImpl.class,
  204. ConfigurationRepositoryImpl.class,
  205. DisabledComponentsHolderImpl.class,
  206. QualityGateServiceImpl.class,
  207. EvaluationResultTextConverterImpl.class,
  208. SourceLinesRepositoryImpl.class,
  209. SourceHashRepositoryImpl.class,
  210. SourceLinesDiffImpl.class,
  211. ScmInfoRepositoryImpl.class,
  212. ScmInfoDbLoader.class,
  213. DuplicationRepositoryImpl.class,
  214. SourceLinesHashRepositoryImpl.class,
  215. DbLineHashVersion.class,
  216. SignificantCodeRepository.class,
  217. SourceLinesHashCache.class,
  218. NewLinesRepository.class,
  219. FileSourceDataComputer.class,
  220. SourceLineReadersFactory.class,
  221. QProfileStatusRepositoryImpl.class,
  222. // issues
  223. RuleRepositoryImpl.class,
  224. ScmAccountToUserLoader.class,
  225. ScmAccountToUser.class,
  226. ProtoIssueCache.class,
  227. DefaultAssignee.class,
  228. IssueVisitors.class,
  229. IssueLifecycle.class,
  230. NewIssueClassifier.class,
  231. ComponentsWithUnprocessedIssues.class,
  232. ComponentIssuesRepositoryImpl.class,
  233. IssueFilter.class,
  234. // common rules
  235. CommonRuleEngineImpl.class,
  236. BranchCoverageRule.class,
  237. LineCoverageRule.class,
  238. CommentDensityRule.class,
  239. DuplicatedBlockRule.class,
  240. TestErrorRule.class,
  241. SkippedTestRule.class,
  242. // order is important: RuleTypeCopier must be the first one. And DebtAggregator must be before NewDebtAggregator (new debt requires
  243. // debt)
  244. RuleTagsCopier.class,
  245. IssueCreationDateCalculator.class,
  246. DebtCalculator.class,
  247. EffortAggregator.class,
  248. NewEffortAggregator.class,
  249. IssueAssigner.class,
  250. IssueCounter.class,
  251. MovedIssueVisitor.class,
  252. IssuesRepositoryVisitor.class,
  253. RemoveProcessedComponentsVisitor.class,
  254. // visitors : order is important, measure computers must be executed at the end in order to access to every measures / issues
  255. LoadComponentUuidsHavingOpenIssuesVisitor.class,
  256. IntegrateIssuesVisitor.class,
  257. CloseIssuesOnRemovedComponentsVisitor.class,
  258. MaintainabilityMeasuresVisitor.class,
  259. NewMaintainabilityMeasuresVisitor.class,
  260. ReliabilityAndSecurityRatingMeasuresVisitor.class,
  261. NewReliabilityAndSecurityRatingMeasuresVisitor.class,
  262. SecurityReviewMeasuresVisitor.class,
  263. NewSecurityReviewMeasuresVisitor.class,
  264. LastCommitVisitor.class,
  265. MeasureComputersVisitor.class,
  266. TargetBranchComponentUuids.class,
  267. UpdateConflictResolver.class,
  268. TrackerBaseInputFactory.class,
  269. TrackerTargetBranchInputFactory.class,
  270. TrackerRawInputFactory.class,
  271. TrackerReferenceBranchInputFactory.class,
  272. TrackerSourceBranchInputFactory.class,
  273. SourceBranchComponentUuids.class,
  274. ClosedIssuesInputFactory.class,
  275. Tracker.class,
  276. TrackerExecution.class,
  277. PullRequestTrackerExecution.class,
  278. PullRequestSourceBranchMerger.class,
  279. ReferenceBranchTrackerExecution.class,
  280. ComponentIssuesLoader.class,
  281. BaseIssuesLoader.class,
  282. IssueTrackingDelegator.class,
  283. BranchPersisterImpl.class,
  284. ProjectPersister.class,
  285. SiblingsIssuesLoader.class,
  286. SiblingsIssueMerger.class,
  287. NewCodePeriodResolver.class,
  288. // filemove
  289. ScoreMatrixDumperImpl.class,
  290. SourceSimilarityImpl.class,
  291. FileSimilarityImpl.class,
  292. MutableMovedFilesRepositoryImpl.class,
  293. AddedFileRepositoryImpl.class,
  294. // duplication
  295. IntegrateCrossProjectDuplications.class,
  296. DuplicationMeasures.class,
  297. // views
  298. ViewIndex.class,
  299. BranchLoader.class,
  300. MeasureToMeasureDto.class,
  301. SmallChangesetQualityGateSpecialCase.class,
  302. // webhooks
  303. WebhookPostTask.class,
  304. // notifications
  305. NotificationFactory.class);
  306. }
  307. }