001 /*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * SonarQube is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * SonarQube is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
019 */
020 package org.sonar.batch.scan2;
021
022 import org.slf4j.Logger;
023 import org.slf4j.LoggerFactory;
024 import org.sonar.api.BatchComponent;
025 import org.sonar.api.batch.InstantiationStrategy;
026 import org.sonar.api.batch.bootstrap.ProjectDefinition;
027 import org.sonar.api.batch.rule.CheckFactory;
028 import org.sonar.api.platform.ComponentContainer;
029 import org.sonar.api.scan.filesystem.FileExclusions;
030 import org.sonar.batch.bootstrap.BatchExtensionDictionnary;
031 import org.sonar.batch.bootstrap.ExtensionInstaller;
032 import org.sonar.batch.bootstrap.ExtensionMatcher;
033 import org.sonar.batch.bootstrap.ExtensionUtils;
034 import org.sonar.batch.events.EventBus;
035 import org.sonar.batch.issue.IssuableFactory;
036 import org.sonar.batch.issue.IssueFilters;
037 import org.sonar.batch.issue.ModuleIssues;
038 import org.sonar.batch.issue.ignore.EnforceIssuesFilter;
039 import org.sonar.batch.issue.ignore.IgnoreIssuesFilter;
040 import org.sonar.batch.issue.ignore.pattern.IssueExclusionPatternInitializer;
041 import org.sonar.batch.issue.ignore.pattern.IssueInclusionPatternInitializer;
042 import org.sonar.batch.issue.ignore.scanner.IssueExclusionsLoader;
043 import org.sonar.batch.issue.ignore.scanner.IssueExclusionsRegexpScanner;
044 import org.sonar.batch.rule.ActiveRulesProvider;
045 import org.sonar.batch.rule.ModuleQProfiles;
046 import org.sonar.batch.rule.QProfileVerifier;
047 import org.sonar.batch.scan.LanguageVerifier;
048 import org.sonar.batch.scan.ModuleSettings;
049 import org.sonar.batch.scan.filesystem.DefaultModuleFileSystem;
050 import org.sonar.batch.scan.filesystem.DeprecatedFileFilters;
051 import org.sonar.batch.scan.filesystem.ExclusionFilters;
052 import org.sonar.batch.scan.filesystem.FileIndexer;
053 import org.sonar.batch.scan.filesystem.FileSystemLogger;
054 import org.sonar.batch.scan.filesystem.InputFileBuilderFactory;
055 import org.sonar.batch.scan.filesystem.LanguageDetectionFactory;
056 import org.sonar.batch.scan.filesystem.ModuleFileSystemInitializer;
057 import org.sonar.batch.scan.filesystem.ModuleInputFileCache;
058 import org.sonar.batch.scan.filesystem.StatusDetectionFactory;
059
060 public class ModuleScanContainer extends ComponentContainer {
061 private static final Logger LOG = LoggerFactory.getLogger(ModuleScanContainer.class);
062 private final ProjectDefinition moduleDefinition;
063
064 public ModuleScanContainer(ProjectScanContainer parent, ProjectDefinition moduleDefinition) {
065 super(parent);
066 this.moduleDefinition = moduleDefinition;
067 }
068
069 @Override
070 protected void doBeforeStart() {
071 LOG.info("------------- Scan {}", moduleDefinition.getName());
072 addCoreComponents();
073 addExtensions();
074 }
075
076 private void addCoreComponents() {
077 add(
078 moduleDefinition,
079 ModuleSettings.class,
080
081 EventBus.class,
082 ModuleScanExecutor.class,
083 ModuleScanExecutor.getPhaseClasses(),
084 moduleDefinition.getContainerExtensions(),
085
086 // file system
087 ModuleInputFileCache.class,
088 FileExclusions.class,
089 ExclusionFilters.class,
090 DeprecatedFileFilters.class,
091 InputFileBuilderFactory.class,
092 StatusDetectionFactory.class,
093 LanguageDetectionFactory.class,
094 FileIndexer.class,
095 LanguageVerifier.class,
096 FileSystemLogger.class,
097 DefaultModuleFileSystem.class,
098 ModuleFileSystemInitializer.class,
099 QProfileVerifier.class,
100
101 AnalyzerOptimizer.class,
102
103 DefaultSensorContext.class,
104 BatchExtensionDictionnary.class,
105 IssueFilters.class,
106
107 // rules
108 ModuleQProfiles.class,
109 new ActiveRulesProvider(),
110 CheckFactory.class,
111
112 // issues
113 IssuableFactory.class,
114 ModuleIssues.class,
115
116 // Measures
117 DefaultFileLinesContextFactory.class,
118
119 // issue exclusions
120 IssueInclusionPatternInitializer.class,
121 IssueExclusionPatternInitializer.class,
122 IssueExclusionsRegexpScanner.class,
123 IssueExclusionsLoader.class,
124 EnforceIssuesFilter.class,
125 IgnoreIssuesFilter.class,
126
127 AnalysisPublisher.class);
128 }
129
130 private void addExtensions() {
131 ExtensionInstaller installer = getComponentByType(ExtensionInstaller.class);
132 installer.install(this, new ExtensionMatcher() {
133 public boolean accept(Object extension) {
134 return ExtensionUtils.isType(extension, BatchComponent.class)
135 && ExtensionUtils.isInstantiationStrategy(extension, InstantiationStrategy.PER_PROJECT);
136 }
137 });
138 }
139
140 @Override
141 protected void doAfterStart() {
142 getComponentByType(ModuleScanExecutor.class).execute();
143 }
144
145 }