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 15KB

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