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.

ModuleScanContainer.java 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /*
  2. * SonarQube, open source software quality management tool.
  3. * Copyright (C) 2008-2014 SonarSource
  4. * mailto:contact AT sonarsource DOT com
  5. *
  6. * SonarQube 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. * SonarQube 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.batch.scan;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import org.sonar.api.batch.InstantiationStrategy;
  24. import org.sonar.api.batch.bootstrap.ProjectDefinition;
  25. import org.sonar.api.batch.fs.internal.FileMetadata;
  26. import org.sonar.api.batch.rule.CheckFactory;
  27. import org.sonar.api.checks.NoSonarFilter;
  28. import org.sonar.api.resources.Project;
  29. import org.sonar.api.scan.filesystem.FileExclusions;
  30. import org.sonar.batch.DefaultProjectTree;
  31. import org.sonar.batch.bootstrap.BatchExtensionDictionnary;
  32. import org.sonar.batch.bootstrap.ExtensionInstaller;
  33. import org.sonar.batch.bootstrap.ExtensionMatcher;
  34. import org.sonar.batch.bootstrap.ExtensionUtils;
  35. import org.sonar.batch.deprecated.DeprecatedSensorContext;
  36. import org.sonar.batch.deprecated.ResourceFilters;
  37. import org.sonar.batch.deprecated.components.DefaultTimeMachine;
  38. import org.sonar.batch.deprecated.perspectives.BatchPerspectives;
  39. import org.sonar.batch.events.EventBus;
  40. import org.sonar.batch.index.DefaultIndex;
  41. import org.sonar.batch.issue.IssuableFactory;
  42. import org.sonar.batch.issue.IssueFilters;
  43. import org.sonar.batch.issue.ModuleIssues;
  44. import org.sonar.batch.issue.ignore.EnforceIssuesFilter;
  45. import org.sonar.batch.issue.ignore.IgnoreIssuesFilter;
  46. import org.sonar.batch.issue.ignore.pattern.IssueExclusionPatternInitializer;
  47. import org.sonar.batch.issue.ignore.pattern.IssueInclusionPatternInitializer;
  48. import org.sonar.batch.issue.ignore.scanner.IssueExclusionsLoader;
  49. import org.sonar.batch.issue.ignore.scanner.IssueExclusionsRegexpScanner;
  50. import org.sonar.batch.phases.DecoratorsExecutor;
  51. import org.sonar.batch.phases.InitializersExecutor;
  52. import org.sonar.batch.phases.PersistersExecutor;
  53. import org.sonar.batch.phases.PhaseExecutor;
  54. import org.sonar.batch.phases.PostJobsExecutor;
  55. import org.sonar.batch.phases.ProjectInitializer;
  56. import org.sonar.batch.phases.SensorsExecutor;
  57. import org.sonar.batch.postjob.DefaultPostJobContext;
  58. import org.sonar.batch.postjob.PostJobOptimizer;
  59. import org.sonar.batch.rule.ModuleQProfiles;
  60. import org.sonar.batch.rule.QProfileDecorator;
  61. import org.sonar.batch.rule.QProfileSensor;
  62. import org.sonar.batch.rule.QProfileVerifier;
  63. import org.sonar.batch.rule.RuleFinderCompatibility;
  64. import org.sonar.batch.rule.RulesProfileProvider;
  65. import org.sonar.batch.scan.filesystem.ComponentIndexer;
  66. import org.sonar.batch.scan.filesystem.DefaultModuleFileSystem;
  67. import org.sonar.batch.scan.filesystem.DeprecatedFileFilters;
  68. import org.sonar.batch.scan.filesystem.ExclusionFilters;
  69. import org.sonar.batch.scan.filesystem.FileIndexer;
  70. import org.sonar.batch.scan.filesystem.FileSystemLogger;
  71. import org.sonar.batch.scan.filesystem.InputFileBuilderFactory;
  72. import org.sonar.batch.scan.filesystem.LanguageDetectionFactory;
  73. import org.sonar.batch.scan.filesystem.ModuleFileSystemInitializer;
  74. import org.sonar.batch.scan.filesystem.ModuleInputFileCache;
  75. import org.sonar.batch.scan.filesystem.ProjectFileSystemAdapter;
  76. import org.sonar.batch.scan.filesystem.StatusDetectionFactory;
  77. import org.sonar.batch.scan.report.IssuesReports;
  78. import org.sonar.batch.sensor.DefaultSensorContext;
  79. import org.sonar.batch.sensor.DefaultSensorStorage;
  80. import org.sonar.batch.sensor.SensorOptimizer;
  81. import org.sonar.batch.sensor.coverage.CoverageExclusions;
  82. import org.sonar.batch.source.HighlightableBuilder;
  83. import org.sonar.batch.source.SymbolizableBuilder;
  84. import org.sonar.core.platform.ComponentContainer;
  85. import org.sonar.core.timemachine.Periods;
  86. public class ModuleScanContainer extends ComponentContainer {
  87. private static final Logger LOG = LoggerFactory.getLogger(ModuleScanContainer.class);
  88. private final Project module;
  89. public ModuleScanContainer(ProjectScanContainer parent, Project module) {
  90. super(parent);
  91. this.module = module;
  92. }
  93. @Override
  94. protected void doBeforeStart() {
  95. LOG.info("------------- Scan {}", module.getName());
  96. addCoreComponents();
  97. addExtensions();
  98. }
  99. private void addCoreComponents() {
  100. ProjectDefinition moduleDefinition = getComponentByType(DefaultProjectTree.class).getProjectDefinition(module);
  101. add(
  102. moduleDefinition,
  103. module,
  104. ModuleSettings.class);
  105. // hack to initialize settings before ExtensionProviders
  106. ModuleSettings moduleSettings = getComponentByType(ModuleSettings.class);
  107. module.setSettings(moduleSettings);
  108. add(
  109. EventBus.class,
  110. Periods.class,
  111. PhaseExecutor.class,
  112. RuleFinderCompatibility.class,
  113. PostJobsExecutor.class,
  114. DecoratorsExecutor.class,
  115. SensorsExecutor.class,
  116. PersistersExecutor.class,
  117. InitializersExecutor.class,
  118. ProjectInitializer.class,
  119. moduleDefinition.getContainerExtensions(),
  120. // file system
  121. ModuleInputFileCache.class,
  122. FileExclusions.class,
  123. ExclusionFilters.class,
  124. DeprecatedFileFilters.class,
  125. InputFileBuilderFactory.class,
  126. FileMetadata.class,
  127. StatusDetectionFactory.class,
  128. LanguageDetectionFactory.class,
  129. FileIndexer.class,
  130. ComponentIndexer.class,
  131. LanguageVerifier.class,
  132. FileSystemLogger.class,
  133. DefaultModuleFileSystem.class,
  134. ModuleFileSystemInitializer.class,
  135. ProjectFileSystemAdapter.class,
  136. QProfileVerifier.class,
  137. SensorOptimizer.class,
  138. PostJobOptimizer.class,
  139. DefaultSensorContext.class,
  140. DefaultPostJobContext.class,
  141. DefaultSensorStorage.class,
  142. DeprecatedSensorContext.class,
  143. BatchExtensionDictionnary.class,
  144. DefaultTimeMachine.class,
  145. IssueFilters.class,
  146. CoverageExclusions.class,
  147. ResourceFilters.class,
  148. // rules
  149. ModuleQProfiles.class,
  150. new RulesProfileProvider(),
  151. QProfileSensor.class,
  152. QProfileDecorator.class,
  153. CheckFactory.class,
  154. // report
  155. IssuesReports.class,
  156. // issues
  157. IssuableFactory.class,
  158. ModuleIssues.class,
  159. org.sonar.api.issue.NoSonarFilter.class,
  160. // issue exclusions
  161. IssueInclusionPatternInitializer.class,
  162. IssueExclusionPatternInitializer.class,
  163. IssueExclusionsRegexpScanner.class,
  164. IssueExclusionsLoader.class,
  165. EnforceIssuesFilter.class,
  166. IgnoreIssuesFilter.class,
  167. NoSonarFilter.class,
  168. // Perspectives
  169. BatchPerspectives.class,
  170. HighlightableBuilder.class,
  171. SymbolizableBuilder.class);
  172. }
  173. private void addExtensions() {
  174. ExtensionInstaller installer = getComponentByType(ExtensionInstaller.class);
  175. installer.install(this, new ExtensionMatcher() {
  176. @Override
  177. public boolean accept(Object extension) {
  178. return ExtensionUtils.isBatchSide(extension) && ExtensionUtils.isInstantiationStrategy(extension, InstantiationStrategy.PER_PROJECT);
  179. }
  180. });
  181. }
  182. @Override
  183. protected void doAfterStart() {
  184. DefaultIndex index = getComponentByType(DefaultIndex.class);
  185. index.setCurrentProject(module, getComponentByType(ModuleIssues.class));
  186. getComponentByType(PhaseExecutor.class).execute(module);
  187. // Free memory since module settings are no more used
  188. module.setSettings(null);
  189. }
  190. }