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    }