aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-batch/src/main/java/org/sonar/batch
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2016-03-14 17:57:48 +0100
committerJulien HENRY <julien.henry@sonarsource.com>2016-03-15 15:42:51 +0100
commit9cf13638be2e9d4a257183378a948554644079d5 (patch)
tree7145347533c770a049e26438bd61163763def628 /sonar-batch/src/main/java/org/sonar/batch
parent3b580212af22ee0871c07e8bd4fbf5b65e8723a0 (diff)
downloadsonarqube-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')
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchComponents.java46
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/ExtensionInstaller.java7
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/cpd/CpdComponents.java4
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/cpd/CpdExecutor.java6
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/cpd/CpdSensor.java5
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/cpd/DefaultCpdBlockIndexer.java (renamed from sonar-batch/src/main/java/org/sonar/batch/cpd/DefaultCpdIndexer.java)26
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/cpd/JavaCpdBlockIndexer.java (renamed from sonar-batch/src/main/java/org/sonar/batch/cpd/JavaCpdIndexer.java)10
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/cpd/index/SonarCpdBlockIndex.java (renamed from sonar-batch/src/main/java/org/sonar/batch/cpd/index/SonarDuplicationsIndex.java)14
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/phases/AbstractPhaseExecutor.java (renamed from sonar-batch/src/main/java/org/sonar/batch/phases/PhaseExecutor.java)75
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/phases/IssuesPhaseExecutor.java84
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/phases/PublishPhaseExecutor.java67
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/report/MetadataPublisher.java4
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java18
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java4
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/scan/report/IssuesReports.java12
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/scm/ScmSensor.java3
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorContext.java39
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/sensor/DefaultSensorStorage.java30
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/sensor/SensorOptimizer.java9
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/sensor/noop/NoOpNewCpdTokens.java43
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/sensor/noop/NoOpNewHighlighting.java43
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/sensor/noop/package-info.java21
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/source/CodeColorizerSensor.java3
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