diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2016-03-14 17:57:48 +0100 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2016-03-15 15:42:51 +0100 |
commit | 9cf13638be2e9d4a257183378a948554644079d5 (patch) | |
tree | 7145347533c770a049e26438bd61163763def628 /sonar-batch/src/main/java/org/sonar/batch | |
parent | 3b580212af22ee0871c07e8bd4fbf5b65e8723a0 (diff) | |
download | sonarqube-9cf13638be2e9d4a257183378a948554644079d5.tar.gz sonarqube-9cf13638be2e9d4a257183378a948554644079d5.zip |
SONAR-7389 Add new Sensor API to provide duplication tokens
Diffstat (limited to 'sonar-batch/src/main/java/org/sonar/batch')
23 files changed, 397 insertions, 176 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchComponents.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchComponents.java index 4b7c4b61f57..aa107887ea4 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchComponents.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchComponents.java @@ -22,6 +22,7 @@ package org.sonar.batch.bootstrap; import com.google.common.collect.Lists; import java.util.Collection; import java.util.List; +import org.sonar.api.batch.AnalysisMode; import org.sonar.batch.cpd.CpdComponents; import org.sonar.batch.issue.tracking.ServerIssueFromWs; import org.sonar.batch.issue.tracking.TrackedIssue; @@ -48,27 +49,9 @@ public class BatchComponents { // only static stuff } - public static Collection<Object> all() { + public static Collection<Object> all(AnalysisMode analysisMode) { List<Object> components = Lists.newArrayList( DefaultResourceTypes.get(), - // SCM - ScmConfiguration.class, - ScmSensor.class, - - LinesSensor.class, - ZeroCoverageSensor.class, - CodeColorizerSensor.class, - - // Issues tracking - new Tracker<TrackedIssue, ServerIssueFromWs>(), - - // Reports - ConsoleReport.class, - JSONReport.class, - HtmlReport.class, - IssuesReportBuilder.class, - SourceProvider.class, - RuleNameProvider.class, // Tasks Tasks.class, @@ -77,8 +60,29 @@ public class BatchComponents { ScanTask.DEFINITION, ScanTask.class); components.addAll(CorePropertyDefinitions.all()); - // CPD - components.addAll(CpdComponents.all()); + if (!analysisMode.isIssues()) { + // SCM + components.add(ScmConfiguration.class); + components.add(ScmSensor.class); + + components.add(LinesSensor.class); + components.add(ZeroCoverageSensor.class); + components.add(CodeColorizerSensor.class); + + // CPD + components.addAll(CpdComponents.all()); + } else { + // Issues tracking + components.add(new Tracker<TrackedIssue, ServerIssueFromWs>()); + + // Issues report + components.add(ConsoleReport.class); + components.add(JSONReport.class); + components.add(HtmlReport.class); + components.add(IssuesReportBuilder.class); + components.add(SourceProvider.class); + components.add(RuleNameProvider.class); + } return components; } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java index 02517f6d696..ff610139032 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java @@ -23,6 +23,7 @@ import java.util.List; import javax.annotation.Nullable; import org.sonar.api.ExtensionProvider; import org.sonar.api.SonarPlugin; +import org.sonar.api.batch.AnalysisMode; import org.sonar.core.platform.ComponentContainer; import org.sonar.core.platform.PluginInfo; import org.sonar.core.platform.PluginRepository; @@ -30,15 +31,17 @@ import org.sonar.core.platform.PluginRepository; public class ExtensionInstaller { private final PluginRepository pluginRepository; + private final AnalysisMode analysisMode; - public ExtensionInstaller(PluginRepository pluginRepository) { + public ExtensionInstaller(PluginRepository pluginRepository, AnalysisMode analysisMode) { this.pluginRepository = pluginRepository; + this.analysisMode = analysisMode; } public ExtensionInstaller install(ComponentContainer container, ExtensionMatcher matcher) { // core components - for (Object o : BatchComponents.all()) { + for (Object o : BatchComponents.all(analysisMode)) { doInstall(container, matcher, null, o); } diff --git a/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdComponents.java b/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdComponents.java index 9414d409d6e..30f4863783d 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdComponents.java +++ b/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdComponents.java @@ -31,8 +31,8 @@ public final class CpdComponents { return ImmutableList.of( CpdSensor.class, CpdMappings.class, - JavaCpdIndexer.class, - DefaultCpdIndexer.class); + JavaCpdBlockIndexer.class, + DefaultCpdBlockIndexer.class); } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdExecutor.java b/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdExecutor.java index 59a48f83fcf..38cee8c127c 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdExecutor.java +++ b/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdExecutor.java @@ -26,7 +26,7 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.config.Settings; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.batch.cpd.index.SonarDuplicationsIndex; +import org.sonar.batch.cpd.index.SonarCpdBlockIndex; import org.sonar.batch.index.BatchComponent; import org.sonar.batch.index.BatchComponentCache; import org.sonar.batch.protocol.output.BatchReport; @@ -64,7 +64,7 @@ public class CpdExecutor { static final int MAX_CLONE_GROUP_PER_FILE = 100; static final int MAX_CLONE_PART_PER_GROUP = 100; - private final SonarDuplicationsIndex index; + private final SonarCpdBlockIndex index; private final ReportPublisher publisher; private final BatchComponentCache batchComponentCache; private final Settings settings; @@ -73,7 +73,7 @@ public class CpdExecutor { private int count; private int total; - public CpdExecutor(Settings settings, SonarDuplicationsIndex index, ReportPublisher publisher, BatchComponentCache batchComponentCache) { + public CpdExecutor(Settings settings, SonarCpdBlockIndex index, ReportPublisher publisher, BatchComponentCache batchComponentCache) { this.settings = settings; this.index = index; this.publisher = publisher; diff --git a/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdSensor.java b/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdSensor.java index 7abede1b42e..9ea1bac9254 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdSensor.java +++ b/sonar-batch/src/main/java/org/sonar/batch/cpd/CpdSensor.java @@ -40,7 +40,7 @@ public class CpdSensor implements Sensor { private Settings settings; private FileSystem fs; - public CpdSensor(JavaCpdIndexer sonarEngine, DefaultCpdIndexer sonarBridgeEngine, Settings settings, FileSystem fs) { + public CpdSensor(JavaCpdBlockIndexer sonarEngine, DefaultCpdBlockIndexer sonarBridgeEngine, Settings settings, FileSystem fs) { this.sonarEngine = sonarEngine; this.sonarBridgeEngine = sonarBridgeEngine; this.settings = settings; @@ -49,8 +49,7 @@ public class CpdSensor implements Sensor { @Override public void describe(SensorDescriptor descriptor) { - descriptor.name("CPD Sensor") - .disabledInIssues(); + descriptor.name("CPD Sensor"); } @VisibleForTesting diff --git a/sonar-batch/src/main/java/org/sonar/batch/cpd/DefaultCpdIndexer.java b/sonar-batch/src/main/java/org/sonar/batch/cpd/DefaultCpdBlockIndexer.java index ffa2a2b684b..33b2f269595 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/cpd/DefaultCpdIndexer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/cpd/DefaultCpdBlockIndexer.java @@ -31,20 +31,20 @@ import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.internal.DefaultInputFile; import org.sonar.api.config.Settings; -import org.sonar.batch.cpd.index.SonarDuplicationsIndex; +import org.sonar.batch.cpd.index.SonarCpdBlockIndex; import org.sonar.duplications.block.Block; import org.sonar.duplications.internal.pmd.TokenizerBridge; -public class DefaultCpdIndexer extends CpdIndexer { +public class DefaultCpdBlockIndexer extends CpdIndexer { - private static final Logger LOG = LoggerFactory.getLogger(DefaultCpdIndexer.class); + private static final Logger LOG = LoggerFactory.getLogger(DefaultCpdBlockIndexer.class); private final CpdMappings mappings; private final FileSystem fs; private final Settings settings; - private final SonarDuplicationsIndex index; + private final SonarCpdBlockIndex index; - public DefaultCpdIndexer(CpdMappings mappings, FileSystem fs, Settings settings, SonarDuplicationsIndex index) { + public DefaultCpdBlockIndexer(CpdMappings mappings, FileSystem fs, Settings settings, SonarCpdBlockIndex index) { this.mappings = mappings; this.fs = fs; this.settings = settings; @@ -76,16 +76,18 @@ public class DefaultCpdIndexer extends CpdIndexer { } // Create index - populateIndex(languageKey, sourceFiles, mapping, index); + populateIndex(languageKey, sourceFiles, mapping); } - private void populateIndex(String languageKey, List<InputFile> sourceFiles, CpdMapping mapping, SonarDuplicationsIndex index) { + private void populateIndex(String languageKey, List<InputFile> sourceFiles, CpdMapping mapping) { TokenizerBridge bridge = new TokenizerBridge(mapping.getTokenizer(), fs.encoding().name(), getBlockSize(languageKey)); for (InputFile inputFile : sourceFiles) { - LOG.debug("Populating index from {}", inputFile); - String resourceEffectiveKey = ((DefaultInputFile) inputFile).key(); - List<Block> blocks = bridge.chunk(resourceEffectiveKey, inputFile.file()); - index.insert(inputFile, blocks); + if (!index.isIndexed(inputFile)) { + LOG.debug("Populating index from {}", inputFile); + String resourceEffectiveKey = ((DefaultInputFile) inputFile).key(); + List<Block> blocks = bridge.chunk(resourceEffectiveKey, inputFile.file()); + index.insert(inputFile, blocks); + } } } @@ -99,7 +101,7 @@ public class DefaultCpdIndexer extends CpdIndexer { } @VisibleForTesting - static int getDefaultBlockSize(String languageKey) { + public static int getDefaultBlockSize(String languageKey) { if ("cobol".equals(languageKey)) { return 30; } else if ("abap".equals(languageKey)) { diff --git a/sonar-batch/src/main/java/org/sonar/batch/cpd/JavaCpdIndexer.java b/sonar-batch/src/main/java/org/sonar/batch/cpd/JavaCpdBlockIndexer.java index fe8fb50006b..a2dde817c74 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/cpd/JavaCpdIndexer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/cpd/JavaCpdBlockIndexer.java @@ -34,7 +34,7 @@ import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.internal.DefaultInputFile; import org.sonar.api.config.Settings; -import org.sonar.batch.cpd.index.SonarDuplicationsIndex; +import org.sonar.batch.cpd.index.SonarCpdBlockIndex; import org.sonar.duplications.block.Block; import org.sonar.duplications.block.BlockChunker; import org.sonar.duplications.java.JavaStatementBuilder; @@ -43,17 +43,17 @@ import org.sonar.duplications.statement.Statement; import org.sonar.duplications.statement.StatementChunker; import org.sonar.duplications.token.TokenChunker; -public class JavaCpdIndexer extends CpdIndexer { +public class JavaCpdBlockIndexer extends CpdIndexer { - private static final Logger LOG = LoggerFactory.getLogger(JavaCpdIndexer.class); + private static final Logger LOG = LoggerFactory.getLogger(JavaCpdBlockIndexer.class); private static final int BLOCK_SIZE = 10; private final FileSystem fs; private final Settings settings; - private final SonarDuplicationsIndex index; + private final SonarCpdBlockIndex index; - public JavaCpdIndexer(FileSystem fs, Settings settings, SonarDuplicationsIndex index) { + public JavaCpdBlockIndexer(FileSystem fs, Settings settings, SonarCpdBlockIndex index) { this.fs = fs; this.settings = settings; this.index = index; diff --git a/sonar-batch/src/main/java/org/sonar/batch/cpd/index/SonarDuplicationsIndex.java b/sonar-batch/src/main/java/org/sonar/batch/cpd/index/SonarCpdBlockIndex.java index b9c904bbe01..48ee611ffaf 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/cpd/index/SonarDuplicationsIndex.java +++ b/sonar-batch/src/main/java/org/sonar/batch/cpd/index/SonarCpdBlockIndex.java @@ -22,8 +22,9 @@ package org.sonar.batch.cpd.index; import com.google.common.base.Function; import com.google.common.collect.Iterables; import java.util.Collection; +import java.util.HashSet; import java.util.Iterator; - +import java.util.Set; import org.apache.commons.lang.StringUtils; import org.sonar.api.CoreProperties; import org.sonar.api.batch.fs.InputFile; @@ -38,14 +39,16 @@ import org.sonar.duplications.index.CloneIndex; import org.sonar.duplications.index.PackedMemoryCloneIndex; import org.sonar.duplications.index.PackedMemoryCloneIndex.ResourceBlocks; -public class SonarDuplicationsIndex extends AbstractCloneIndex { +public class SonarCpdBlockIndex extends AbstractCloneIndex { private final CloneIndex mem = new PackedMemoryCloneIndex(); private final ReportPublisher publisher; private final BatchComponentCache batchComponentCache; private final Settings settings; + // Files already tokenized + private final Set<InputFile> indexedFiles = new HashSet<>(); - public SonarDuplicationsIndex(ReportPublisher publisher, BatchComponentCache batchComponentCache, Settings settings) { + public SonarCpdBlockIndex(ReportPublisher publisher, BatchComponentCache batchComponentCache, Settings settings) { this.publisher = publisher; this.batchComponentCache = batchComponentCache; this.settings = settings; @@ -71,6 +74,11 @@ public class SonarDuplicationsIndex extends AbstractCloneIndex { for (Block block : blocks) { mem.insert(block); } + indexedFiles.add(inputFile); + } + + public boolean isIndexed(InputFile inputFile) { + return indexedFiles.contains(inputFile); } public static boolean isCrossProjectDuplicationEnabled(Settings settings) { diff --git a/sonar-batch/src/main/java/org/sonar/batch/phases/PhaseExecutor.java b/sonar-batch/src/main/java/org/sonar/batch/phases/AbstractPhaseExecutor.java index e8cbd7de640..c388b75f1f3 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/phases/PhaseExecutor.java +++ b/sonar-batch/src/main/java/org/sonar/batch/phases/AbstractPhaseExecutor.java @@ -21,27 +21,20 @@ package org.sonar.batch.phases; import org.sonar.api.batch.SensorContext; import org.sonar.api.resources.Project; -import org.sonar.batch.analysis.DefaultAnalysisMode; -import org.sonar.batch.cpd.CpdExecutor; import org.sonar.batch.events.BatchStepEvent; import org.sonar.batch.events.EventBus; import org.sonar.batch.index.DefaultIndex; -import org.sonar.batch.issue.IssueCallback; import org.sonar.batch.issue.ignore.scanner.IssueExclusionsLoader; -import org.sonar.batch.issue.tracking.IssueTransition; -import org.sonar.batch.report.ReportPublisher; import org.sonar.batch.rule.QProfileVerifier; import org.sonar.batch.scan.filesystem.DefaultModuleFileSystem; import org.sonar.batch.scan.filesystem.FileSystemLogger; -import org.sonar.batch.scan.report.IssuesReports; -public final class PhaseExecutor { +public abstract class AbstractPhaseExecutor { private final EventBus eventBus; private final PostJobsExecutor postJobsExecutor; private final InitializersExecutor initializersExecutor; private final SensorsExecutor sensorsExecutor; - private final ReportPublisher reportPublisher; private final SensorContext sensorContext; private final DefaultIndex index; private final ProjectInitializer pi; @@ -49,41 +42,29 @@ public final class PhaseExecutor { private final DefaultModuleFileSystem fs; private final QProfileVerifier profileVerifier; private final IssueExclusionsLoader issueExclusionsLoader; - private final IssuesReports issuesReport; - private final DefaultAnalysisMode analysisMode; - private final IssueTransition localIssueTracking; - private final IssueCallback issueCallback; - private final CpdExecutor cpdExecutor; - public PhaseExecutor(InitializersExecutor initializersExecutor, PostJobsExecutor postJobsExecutor, SensorsExecutor sensorsExecutor, + public AbstractPhaseExecutor(InitializersExecutor initializersExecutor, PostJobsExecutor postJobsExecutor, SensorsExecutor sensorsExecutor, SensorContext sensorContext, DefaultIndex index, - EventBus eventBus, ReportPublisher reportPublisher, ProjectInitializer pi, - FileSystemLogger fsLogger, IssuesReports jsonReport, DefaultModuleFileSystem fs, QProfileVerifier profileVerifier, - IssueExclusionsLoader issueExclusionsLoader, DefaultAnalysisMode analysisMode, IssueTransition localIssueTracking, IssueCallback issueCallback, - CpdExecutor cpdExecutor) { + EventBus eventBus, ProjectInitializer pi, + FileSystemLogger fsLogger, DefaultModuleFileSystem fs, QProfileVerifier profileVerifier, + IssueExclusionsLoader issueExclusionsLoader) { this.postJobsExecutor = postJobsExecutor; this.initializersExecutor = initializersExecutor; this.sensorsExecutor = sensorsExecutor; this.sensorContext = sensorContext; this.index = index; this.eventBus = eventBus; - this.reportPublisher = reportPublisher; this.pi = pi; this.fsLogger = fsLogger; - this.issuesReport = jsonReport; this.fs = fs; this.profileVerifier = profileVerifier; this.issueExclusionsLoader = issueExclusionsLoader; - this.analysisMode = analysisMode; - this.localIssueTracking = localIssueTracking; - this.issueCallback = issueCallback; - this.cpdExecutor = cpdExecutor; } /** * Executed on each module */ - public void execute(Project module) { + public final void execute(Project module) { pi.execute(module); eventBus.fireEvent(new ProjectAnalysisEvent(module, true)); @@ -102,54 +83,14 @@ public final class PhaseExecutor { sensorsExecutor.execute(sensorContext); if (module.isRoot()) { - if (analysisMode.isIssues()) { - localIssueTracking(); - issuesCallback(); - } else { - computeDuplications(); - } - issuesReport(); - publishReportJob(); + executeOnRoot(); postJobsExecutor.execute(sensorContext); } cleanMemory(); eventBus.fireEvent(new ProjectAnalysisEvent(module, false)); } - private void computeDuplications() { - String stepName = "Computing duplications"; - eventBus.fireEvent(new BatchStepEvent(stepName, true)); - cpdExecutor.execute(); - eventBus.fireEvent(new BatchStepEvent(stepName, false)); - } - - private void publishReportJob() { - String stepName = "Publish report"; - eventBus.fireEvent(new BatchStepEvent(stepName, true)); - this.reportPublisher.execute(); - eventBus.fireEvent(new BatchStepEvent(stepName, false)); - } - - private void localIssueTracking() { - String stepName = "Local Issue Tracking"; - eventBus.fireEvent(new BatchStepEvent(stepName, true)); - localIssueTracking.execute(); - eventBus.fireEvent(new BatchStepEvent(stepName, false)); - } - - private void issuesCallback() { - String stepName = "Issues Callback"; - eventBus.fireEvent(new BatchStepEvent(stepName, true)); - issueCallback.execute(); - eventBus.fireEvent(new BatchStepEvent(stepName, false)); - } - - private void issuesReport() { - String stepName = "Issues Reports"; - eventBus.fireEvent(new BatchStepEvent(stepName, true)); - issuesReport.execute(); - eventBus.fireEvent(new BatchStepEvent(stepName, false)); - } + protected abstract void executeOnRoot(); private void initIssueExclusions() { String stepName = "Init issue exclusions"; diff --git a/sonar-batch/src/main/java/org/sonar/batch/phases/IssuesPhaseExecutor.java b/sonar-batch/src/main/java/org/sonar/batch/phases/IssuesPhaseExecutor.java new file mode 100644 index 00000000000..ba9a155962e --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/phases/IssuesPhaseExecutor.java @@ -0,0 +1,84 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch.phases; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.sonar.api.batch.SensorContext; +import org.sonar.batch.events.BatchStepEvent; +import org.sonar.batch.events.EventBus; +import org.sonar.batch.index.DefaultIndex; +import org.sonar.batch.issue.IssueCallback; +import org.sonar.batch.issue.ignore.scanner.IssueExclusionsLoader; +import org.sonar.batch.issue.tracking.IssueTransition; +import org.sonar.batch.rule.QProfileVerifier; +import org.sonar.batch.scan.filesystem.DefaultModuleFileSystem; +import org.sonar.batch.scan.filesystem.FileSystemLogger; +import org.sonar.batch.scan.report.IssuesReports; + +public final class IssuesPhaseExecutor extends AbstractPhaseExecutor { + + private static final Logger LOG = LoggerFactory.getLogger(IssuesPhaseExecutor.class); + + private final EventBus eventBus; + private final IssuesReports issuesReport; + private final IssueTransition localIssueTracking; + private final IssueCallback issueCallback; + + public IssuesPhaseExecutor(InitializersExecutor initializersExecutor, PostJobsExecutor postJobsExecutor, SensorsExecutor sensorsExecutor, SensorContext sensorContext, + DefaultIndex index, EventBus eventBus, ProjectInitializer pi, FileSystemLogger fsLogger, IssuesReports jsonReport, DefaultModuleFileSystem fs, QProfileVerifier profileVerifier, + IssueExclusionsLoader issueExclusionsLoader, IssueTransition localIssueTracking, IssueCallback issueCallback) { + super(initializersExecutor, postJobsExecutor, sensorsExecutor, sensorContext, index, eventBus, pi, fsLogger, fs, profileVerifier, issueExclusionsLoader); + this.eventBus = eventBus; + this.issuesReport = jsonReport; + this.localIssueTracking = localIssueTracking; + this.issueCallback = issueCallback; + } + + @Override + protected void executeOnRoot() { + localIssueTracking(); + issuesCallback(); + issuesReport(); + LOG.info("ANALYSIS SUCCESSFUL"); + } + + private void localIssueTracking() { + String stepName = "Local Issue Tracking"; + eventBus.fireEvent(new BatchStepEvent(stepName, true)); + localIssueTracking.execute(); + eventBus.fireEvent(new BatchStepEvent(stepName, false)); + } + + private void issuesCallback() { + String stepName = "Issues Callback"; + eventBus.fireEvent(new BatchStepEvent(stepName, true)); + issueCallback.execute(); + eventBus.fireEvent(new BatchStepEvent(stepName, false)); + } + + private void issuesReport() { + String stepName = "Issues Reports"; + eventBus.fireEvent(new BatchStepEvent(stepName, true)); + issuesReport.execute(); + eventBus.fireEvent(new BatchStepEvent(stepName, false)); + } + +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/phases/PublishPhaseExecutor.java b/sonar-batch/src/main/java/org/sonar/batch/phases/PublishPhaseExecutor.java new file mode 100644 index 00000000000..33073a110b3 --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/phases/PublishPhaseExecutor.java @@ -0,0 +1,67 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch.phases; + +import org.sonar.api.batch.SensorContext; +import org.sonar.batch.cpd.CpdExecutor; +import org.sonar.batch.events.BatchStepEvent; +import org.sonar.batch.events.EventBus; +import org.sonar.batch.index.DefaultIndex; +import org.sonar.batch.issue.ignore.scanner.IssueExclusionsLoader; +import org.sonar.batch.report.ReportPublisher; +import org.sonar.batch.rule.QProfileVerifier; +import org.sonar.batch.scan.filesystem.DefaultModuleFileSystem; +import org.sonar.batch.scan.filesystem.FileSystemLogger; + +public final class PublishPhaseExecutor extends AbstractPhaseExecutor { + + private final EventBus eventBus; + private final ReportPublisher reportPublisher; + private final CpdExecutor cpdExecutor; + + public PublishPhaseExecutor(InitializersExecutor initializersExecutor, PostJobsExecutor postJobsExecutor, SensorsExecutor sensorsExecutor, SensorContext sensorContext, + DefaultIndex index, EventBus eventBus, ReportPublisher reportPublisher, ProjectInitializer pi, FileSystemLogger fsLogger, DefaultModuleFileSystem fs, + QProfileVerifier profileVerifier, IssueExclusionsLoader issueExclusionsLoader, CpdExecutor cpdExecutor) { + super(initializersExecutor, postJobsExecutor, sensorsExecutor, sensorContext, index, eventBus, pi, fsLogger, fs, profileVerifier, issueExclusionsLoader); + this.eventBus = eventBus; + this.reportPublisher = reportPublisher; + this.cpdExecutor = cpdExecutor; + } + + @Override + protected void executeOnRoot() { + computeDuplications(); + publishReportJob(); + } + + private void computeDuplications() { + String stepName = "Computing duplications"; + eventBus.fireEvent(new BatchStepEvent(stepName, true)); + cpdExecutor.execute(); + eventBus.fireEvent(new BatchStepEvent(stepName, false)); + } + + private void publishReportJob() { + String stepName = "Publish report"; + eventBus.fireEvent(new BatchStepEvent(stepName, true)); + this.reportPublisher.execute(); + eventBus.fireEvent(new BatchStepEvent(stepName, false)); + } +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/report/MetadataPublisher.java b/sonar-batch/src/main/java/org/sonar/batch/report/MetadataPublisher.java index f6df892913c..eac42e0ad7d 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/report/MetadataPublisher.java +++ b/sonar-batch/src/main/java/org/sonar/batch/report/MetadataPublisher.java @@ -23,7 +23,7 @@ import org.sonar.api.CoreProperties; import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.api.config.Settings; import org.sonar.api.resources.Project; -import org.sonar.batch.cpd.index.SonarDuplicationsIndex; +import org.sonar.batch.cpd.index.SonarCpdBlockIndex; import org.sonar.batch.index.BatchComponent; import org.sonar.batch.index.BatchComponentCache; import org.sonar.batch.protocol.output.BatchReport; @@ -50,7 +50,7 @@ public class MetadataPublisher implements ReportPublisherStep { .setAnalysisDate(((Project) rootProject.resource()).getAnalysisDate().getTime()) // Here we want key without branch .setProjectKey(root.getKey()) - .setCrossProjectDuplicationActivated(SonarDuplicationsIndex.isCrossProjectDuplicationEnabled(settings)) + .setCrossProjectDuplicationActivated(SonarCpdBlockIndex.isCrossProjectDuplicationEnabled(settings)) .setRootComponentRef(rootProject.batchId()); String branch = root.properties().get(CoreProperties.PROJECT_BRANCH_PROPERTY); if (branch != null) { diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java index 9f16173f65e..56da7fd624d 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java @@ -21,6 +21,7 @@ package org.sonar.batch.scan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.sonar.api.batch.AnalysisMode; import org.sonar.api.batch.InstantiationStrategy; import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.api.batch.fs.internal.FileMetadata; @@ -46,10 +47,12 @@ import org.sonar.batch.issue.ignore.pattern.IssueExclusionPatternInitializer; import org.sonar.batch.issue.ignore.pattern.IssueInclusionPatternInitializer; import org.sonar.batch.issue.ignore.scanner.IssueExclusionsLoader; import org.sonar.batch.issue.ignore.scanner.IssueExclusionsRegexpScanner; +import org.sonar.batch.phases.AbstractPhaseExecutor; import org.sonar.batch.phases.InitializersExecutor; -import org.sonar.batch.phases.PhaseExecutor; +import org.sonar.batch.phases.IssuesPhaseExecutor; import org.sonar.batch.phases.PostJobsExecutor; import org.sonar.batch.phases.ProjectInitializer; +import org.sonar.batch.phases.PublishPhaseExecutor; import org.sonar.batch.phases.SensorsExecutor; import org.sonar.batch.postjob.DefaultPostJobContext; import org.sonar.batch.postjob.PostJobOptimizer; @@ -104,9 +107,15 @@ public class ModuleScanContainer extends ComponentContainer { ModuleSettings moduleSettings = getComponentByType(ModuleSettings.class); module.setSettings(moduleSettings); + if (getComponentByType(AnalysisMode.class).isIssues()) { + add(IssuesPhaseExecutor.class, + IssuesReports.class); + } else { + add(PublishPhaseExecutor.class); + } + add( EventBus.class, - PhaseExecutor.class, RuleFinderCompatibility.class, PostJobsExecutor.class, SensorsExecutor.class, @@ -145,9 +154,6 @@ public class ModuleScanContainer extends ComponentContainer { QProfileSensor.class, CheckFactory.class, - // report - IssuesReports.class, - // issues IssuableFactory.class, ModuleIssues.class, @@ -182,7 +188,7 @@ public class ModuleScanContainer extends ComponentContainer { DefaultIndex index = getComponentByType(DefaultIndex.class); index.setCurrentProject(module, getComponentByType(DefaultSensorStorage.class)); - getComponentByType(PhaseExecutor.class).execute(module); + getComponentByType(AbstractPhaseExecutor.class).execute(module); // Free memory since module settings are no more used module.setSettings(null); diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java index 1c7d13a0df5..f92f07acce8 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java @@ -42,7 +42,7 @@ import org.sonar.batch.bootstrap.ExtensionUtils; import org.sonar.batch.bootstrap.MetricProvider; import org.sonar.batch.cache.ProjectPersistentCacheProvider; import org.sonar.batch.cpd.CpdExecutor; -import org.sonar.batch.cpd.index.SonarDuplicationsIndex; +import org.sonar.batch.cpd.index.SonarCpdBlockIndex; import org.sonar.batch.events.EventBus; import org.sonar.batch.index.BatchComponentCache; import org.sonar.batch.index.Caches; @@ -209,7 +209,7 @@ public class ProjectScanContainer extends ComponentContainer { // Cpd CpdExecutor.class, - SonarDuplicationsIndex.class, + SonarCpdBlockIndex.class, ScanTaskObservers.class, UserRepositoryLoader.class); diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/report/IssuesReports.java b/sonar-batch/src/main/java/org/sonar/batch/scan/report/IssuesReports.java index 09007f83035..ac4a5abb375 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/report/IssuesReports.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/report/IssuesReports.java @@ -19,26 +19,20 @@ */ package org.sonar.batch.scan.report; -import org.sonar.batch.analysis.DefaultAnalysisMode; - import org.sonar.api.batch.BatchSide; @BatchSide public class IssuesReports { - private final DefaultAnalysisMode analysisMode; private final Reporter[] reporters; - public IssuesReports(DefaultAnalysisMode analysisMode, Reporter... reporters) { + public IssuesReports(Reporter... reporters) { this.reporters = reporters; - this.analysisMode = analysisMode; } public void execute() { - if (analysisMode.isIssues() || analysisMode.isMediumTest()) { - for (Reporter reporter : reporters) { - reporter.execute(); - } + for (Reporter reporter : reporters) { + reporter.execute(); } } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/scm/ScmSensor.java b/sonar-batch/src/main/java/org/sonar/batch/scm/ScmSensor.java index 34547bfa932..078224bb6c6 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scm/ScmSensor.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scm/ScmSensor.java @@ -60,8 +60,7 @@ public final class ScmSensor implements Sensor { @Override public void describe(SensorDescriptor descriptor) { - descriptor.name("SCM Sensor") - .disabledInIssues(); + descriptor.name("SCM Sensor"); } @Override diff --git a/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorContext.java b/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorContext.java index 22251b3de9c..1080dab084a 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorContext.java +++ b/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorContext.java @@ -22,14 +22,14 @@ package org.sonar.batch.sensor; import java.io.Serializable; import org.sonar.api.batch.AnalysisMode; import org.sonar.api.batch.fs.FileSystem; -import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputModule; import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.coverage.NewCoverage; import org.sonar.api.batch.sensor.coverage.internal.DefaultCoverage; +import org.sonar.api.batch.sensor.cpd.NewCpdTokens; +import org.sonar.api.batch.sensor.cpd.internal.DefaultCpdTokens; import org.sonar.api.batch.sensor.highlighting.NewHighlighting; -import org.sonar.api.batch.sensor.highlighting.TypeOfText; import org.sonar.api.batch.sensor.highlighting.internal.DefaultHighlighting; import org.sonar.api.batch.sensor.internal.SensorStorage; import org.sonar.api.batch.sensor.issue.NewIssue; @@ -37,29 +37,13 @@ import org.sonar.api.batch.sensor.issue.internal.DefaultIssue; import org.sonar.api.batch.sensor.measure.NewMeasure; import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure; import org.sonar.api.config.Settings; +import org.sonar.batch.sensor.noop.NoOpNewCpdTokens; +import org.sonar.batch.sensor.noop.NoOpNewHighlighting; public class DefaultSensorContext implements SensorContext { private static final NoOpNewHighlighting NO_OP_NEW_HIGHLIGHTING = new NoOpNewHighlighting(); - - private static final class NoOpNewHighlighting implements NewHighlighting { - @Override - public void save() { - // Do nothing - } - - @Override - public NewHighlighting onFile(InputFile inputFile) { - // Do nothing - return this; - } - - @Override - public NewHighlighting highlight(int startOffset, int endOffset, TypeOfText typeOfText) { - // Do nothing - return this; - } - } + private static final NoOpNewCpdTokens NO_OP_NEW_CPD_TOKENS = new NoOpNewCpdTokens(); private final Settings settings; private final FileSystem fs; @@ -93,11 +77,6 @@ public class DefaultSensorContext implements SensorContext { } @Override - public AnalysisMode analysisMode() { - return analysisMode; - } - - @Override public InputModule module() { return module; } @@ -125,4 +104,12 @@ public class DefaultSensorContext implements SensorContext { return new DefaultCoverage(sensorStorage); } + @Override + public NewCpdTokens newCpdTokens() { + if (analysisMode.isIssues()) { + return NO_OP_NEW_CPD_TOKENS; + } + return new DefaultCpdTokens(sensorStorage); + } + } diff --git a/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorStorage.java b/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorStorage.java index 09604877532..096a115d425 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorStorage.java +++ b/sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorStorage.java @@ -19,6 +19,7 @@ */ package org.sonar.batch.sensor; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; import com.google.common.collect.Iterables; import java.util.Arrays; @@ -37,6 +38,7 @@ import org.sonar.api.batch.measure.MetricFinder; import org.sonar.api.batch.rule.ActiveRules; import org.sonar.api.batch.sensor.coverage.CoverageType; import org.sonar.api.batch.sensor.coverage.internal.DefaultCoverage; +import org.sonar.api.batch.sensor.cpd.internal.DefaultCpdTokens; import org.sonar.api.batch.sensor.highlighting.internal.DefaultHighlighting; import org.sonar.api.batch.sensor.highlighting.internal.SyntaxHighlightingRule; import org.sonar.api.batch.sensor.internal.SensorStorage; @@ -51,6 +53,8 @@ import org.sonar.api.resources.Resource; import org.sonar.api.source.Symbol; import org.sonar.api.utils.KeyValueFormat; import org.sonar.api.utils.SonarException; +import org.sonar.batch.cpd.DefaultCpdBlockIndexer; +import org.sonar.batch.cpd.index.SonarCpdBlockIndex; import org.sonar.batch.index.BatchComponent; import org.sonar.batch.index.BatchComponentCache; import org.sonar.batch.issue.ModuleIssues; @@ -61,6 +65,8 @@ import org.sonar.batch.report.ReportPublisher; import org.sonar.batch.scan.measure.MeasureCache; import org.sonar.batch.sensor.coverage.CoverageExclusions; import org.sonar.batch.source.DefaultSymbol; +import org.sonar.duplications.block.Block; +import org.sonar.duplications.internal.pmd.PmdBlockChunker; public class DefaultSensorStorage implements SensorStorage { @@ -90,16 +96,20 @@ public class DefaultSensorStorage implements SensorStorage { private final BatchComponentCache componentCache; private final ReportPublisher reportPublisher; private final MeasureCache measureCache; + private final SonarCpdBlockIndex index; + private final Settings settings; public DefaultSensorStorage(MetricFinder metricFinder, ModuleIssues moduleIssues, Settings settings, FileSystem fs, ActiveRules activeRules, - CoverageExclusions coverageExclusions, BatchComponentCache componentCache, ReportPublisher reportPublisher, MeasureCache measureCache) { + CoverageExclusions coverageExclusions, BatchComponentCache componentCache, ReportPublisher reportPublisher, MeasureCache measureCache, SonarCpdBlockIndex index) { this.metricFinder = metricFinder; this.moduleIssues = moduleIssues; + this.settings = settings; this.coverageExclusions = coverageExclusions; this.componentCache = componentCache; this.reportPublisher = reportPublisher; this.measureCache = measureCache; + this.index = index; } private Metric findMetricOrFail(String metricKey) { @@ -254,4 +264,22 @@ public class DefaultSensorStorage implements SensorStorage { return builder.build(); } } + + @Override + public void store(DefaultCpdTokens defaultCpdTokens) { + InputFile inputFile = defaultCpdTokens.inputFile(); + PmdBlockChunker blockChunker = new PmdBlockChunker(getBlockSize(inputFile.language())); + List<Block> blocks = blockChunker.chunk(inputFile.key(), defaultCpdTokens.getTokenLines()); + index.insert(inputFile, blocks); + } + + @VisibleForTesting + int getBlockSize(String languageKey) { + int blockSize = settings.getInt("sonar.cpd." + languageKey + ".minimumLines"); + if (blockSize == 0) { + blockSize = DefaultCpdBlockIndexer.getDefaultBlockSize(languageKey); + } + return blockSize; + } + } diff --git a/sonar-batch/src/main/java/org/sonar/batch/sensor/SensorOptimizer.java b/sonar-batch/src/main/java/org/sonar/batch/sensor/SensorOptimizer.java index 9b64ba381d3..7e8dd63e93a 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/sensor/SensorOptimizer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/sensor/SensorOptimizer.java @@ -21,7 +21,6 @@ package org.sonar.batch.sensor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.sonar.api.batch.AnalysisMode; import org.sonar.api.batch.BatchSide; import org.sonar.api.batch.fs.FilePredicate; import org.sonar.api.batch.fs.FileSystem; @@ -37,13 +36,11 @@ public class SensorOptimizer { private final FileSystem fs; private final ActiveRules activeRules; private final Settings settings; - private final AnalysisMode analysisMode; - public SensorOptimizer(FileSystem fs, ActiveRules activeRules, Settings settings, AnalysisMode analysisMode) { + public SensorOptimizer(FileSystem fs, ActiveRules activeRules, Settings settings) { this.fs = fs; this.activeRules = activeRules; this.settings = settings; - this.analysisMode = analysisMode; } /** @@ -62,10 +59,6 @@ public class SensorOptimizer { LOG.debug("'{}' skipped because one of the required properties is missing", descriptor.name()); return false; } - if (descriptor.isDisabledInIssues() && analysisMode.isIssues()) { - LOG.debug("'{}' skipped in issues mode", descriptor.name()); - return false; - } return true; } diff --git a/sonar-batch/src/main/java/org/sonar/batch/sensor/noop/NoOpNewCpdTokens.java b/sonar-batch/src/main/java/org/sonar/batch/sensor/noop/NoOpNewCpdTokens.java new file mode 100644 index 00000000000..afd00476b2a --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/sensor/noop/NoOpNewCpdTokens.java @@ -0,0 +1,43 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch.sensor.noop; + +import org.sonar.api.batch.fs.InputFile; +import org.sonar.api.batch.fs.TextRange; +import org.sonar.api.batch.sensor.cpd.NewCpdTokens; + +public class NoOpNewCpdTokens implements NewCpdTokens { + @Override + public void save() { + // Do nothing + } + + @Override + public NoOpNewCpdTokens onFile(InputFile inputFile) { + // Do nothing + return this; + } + + @Override + public NewCpdTokens addToken(TextRange range, String image) { + // Do nothing + return this; + } +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/sensor/noop/NoOpNewHighlighting.java b/sonar-batch/src/main/java/org/sonar/batch/sensor/noop/NoOpNewHighlighting.java new file mode 100644 index 00000000000..7ead32f7f04 --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/sensor/noop/NoOpNewHighlighting.java @@ -0,0 +1,43 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.batch.sensor.noop; + +import org.sonar.api.batch.fs.InputFile; +import org.sonar.api.batch.sensor.highlighting.NewHighlighting; +import org.sonar.api.batch.sensor.highlighting.TypeOfText; + +public class NoOpNewHighlighting implements NewHighlighting { + @Override + public void save() { + // Do nothing + } + + @Override + public NewHighlighting onFile(InputFile inputFile) { + // Do nothing + return this; + } + + @Override + public NewHighlighting highlight(int startOffset, int endOffset, TypeOfText typeOfText) { + // Do nothing + return this; + } +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/sensor/noop/package-info.java b/sonar-batch/src/main/java/org/sonar/batch/sensor/noop/package-info.java new file mode 100644 index 00000000000..0a654a40800 --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/sensor/noop/package-info.java @@ -0,0 +1,21 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +@javax.annotation.ParametersAreNonnullByDefault +package org.sonar.batch.sensor.noop; diff --git a/sonar-batch/src/main/java/org/sonar/batch/source/CodeColorizerSensor.java b/sonar-batch/src/main/java/org/sonar/batch/source/CodeColorizerSensor.java index f2d9f40bfb9..158e02a9777 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/source/CodeColorizerSensor.java +++ b/sonar-batch/src/main/java/org/sonar/batch/source/CodeColorizerSensor.java @@ -44,8 +44,7 @@ public final class CodeColorizerSensor implements Sensor { @Override public void describe(SensorDescriptor descriptor) { - descriptor.name("Code Colorizer Sensor") - .disabledInIssues(); + descriptor.name("Code Colorizer Sensor"); } @Override |