aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/sonar-cpd-plugin
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2014-01-21 14:55:24 +0100
committerJulien HENRY <julien.henry@sonarsource.com>2014-01-24 16:02:04 +0100
commit08de7bc30c13fdd63d8e4342a57f4b67d7c15aa9 (patch)
tree8bb9933ac0606a2b61c53c49dab639ef032ad3a3 /plugins/sonar-cpd-plugin
parent547f5d859251a6c4406fcc94db5faa54362465f3 (diff)
downloadsonarqube-08de7bc30c13fdd63d8e4342a57f4b67d7c15aa9.tar.gz
sonarqube-08de7bc30c13fdd63d8e4342a57f4b67d7c15aa9.zip
SONAR-926 Multi-language support:
* RulesProfile wrapper * ModuleFileSystem now support multi language * Sensors executed trying each language until one is found
Diffstat (limited to 'plugins/sonar-cpd-plugin')
-rw-r--r--plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/CpdSensor.java41
-rw-r--r--plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/CpdSensorTest.java41
2 files changed, 42 insertions, 40 deletions
diff --git a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/CpdSensor.java b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/CpdSensor.java
index d83bb5428d4..47c3c15e55d 100644
--- a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/CpdSensor.java
+++ b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/CpdSensor.java
@@ -26,7 +26,9 @@ import org.sonar.api.CoreProperties;
import org.sonar.api.batch.Sensor;
import org.sonar.api.batch.SensorContext;
import org.sonar.api.config.Settings;
+import org.sonar.api.resources.Language;
import org.sonar.api.resources.Project;
+import org.sonar.batch.scan.language.ModuleLanguages;
public class CpdSensor implements Sensor {
@@ -35,30 +37,22 @@ public class CpdSensor implements Sensor {
private CpdEngine sonarEngine;
private CpdEngine sonarBridgeEngine;
private Settings settings;
+ private ModuleLanguages moduleLanguages;
- public CpdSensor(SonarEngine sonarEngine, SonarBridgeEngine sonarBridgeEngine, Settings settings) {
+ public CpdSensor(SonarEngine sonarEngine, SonarBridgeEngine sonarBridgeEngine, Settings settings, ModuleLanguages moduleLanguages) {
this.sonarEngine = sonarEngine;
this.sonarBridgeEngine = sonarBridgeEngine;
this.settings = settings;
+ this.moduleLanguages = moduleLanguages;
}
public boolean shouldExecuteOnProject(Project project) {
- if (isSkipped(project)) {
- LOG.info("Detection of duplicated code is skipped");
- return false;
- }
-
- if (!getEngine(project).isLanguageSupported(project.getLanguage())) {
- LOG.debug("Detection of duplicated code is not supported for {}.", project.getLanguage());
- return false;
- }
-
return true;
}
@VisibleForTesting
- CpdEngine getEngine(Project project) {
- if (sonarEngine.isLanguageSupported(project.getLanguage())) {
+ CpdEngine getEngine(Language language) {
+ if (sonarEngine.isLanguageSupported(language)) {
return sonarEngine;
} else {
return sonarBridgeEngine;
@@ -66,8 +60,8 @@ public class CpdSensor implements Sensor {
}
@VisibleForTesting
- boolean isSkipped(Project project) {
- String key = "sonar.cpd." + project.getLanguageKey() + ".skip";
+ boolean isSkipped(Language language) {
+ String key = "sonar.cpd." + language.getKey() + ".skip";
if (settings.hasKey(key)) {
return settings.getBoolean(key);
}
@@ -75,9 +69,20 @@ public class CpdSensor implements Sensor {
}
public void analyse(Project project, SensorContext context) {
- CpdEngine engine = getEngine(project);
- LOG.info("{} is used", engine);
- engine.analyse(project, context);
+ for (Language language : moduleLanguages.getModuleLanguages()) {
+ if (isSkipped(language)) {
+ LOG.info("Detection of duplicated code is skipped for {}.", language);
+ continue;
+ }
+
+ CpdEngine engine = getEngine(language);
+ if (!engine.isLanguageSupported(language)) {
+ LOG.debug("Detection of duplicated code is not supported for {}.", language);
+ continue;
+ }
+ LOG.info("{} is used for {}", engine, language);
+ engine.analyse(project, context);
+ }
}
@Override
diff --git a/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/CpdSensorTest.java b/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/CpdSensorTest.java
index 0cf3ade848b..d410d658eeb 100644
--- a/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/CpdSensorTest.java
+++ b/plugins/sonar-cpd-plugin/src/test/java/org/sonar/plugins/cpd/CpdSensorTest.java
@@ -19,14 +19,15 @@
*/
package org.sonar.plugins.cpd;
-import org.apache.commons.configuration.PropertiesConfiguration;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.Settings;
+import org.sonar.api.resources.AbstractLanguage;
import org.sonar.api.resources.Java;
import org.sonar.api.resources.Language;
-import org.sonar.api.resources.Project;
+import org.sonar.api.resources.Languages;
+import org.sonar.batch.scan.language.ModuleLanguages;
import org.sonar.plugins.cpd.index.IndexFactory;
import static org.fest.assertions.Assertions.assertThat;
@@ -38,6 +39,7 @@ public class CpdSensorTest {
SonarBridgeEngine sonarBridgeEngine;
CpdSensor sensor;
Settings settings;
+ private Language phpLanguage;
@Before
public void setUp() {
@@ -45,45 +47,40 @@ public class CpdSensorTest {
sonarEngine = new SonarEngine(indexFactory, null, null);
sonarBridgeEngine = new SonarBridgeEngine(indexFactory, null, null);
settings = new Settings(new PropertyDefinitions(CpdPlugin.class));
- sensor = new CpdSensor(sonarEngine, sonarBridgeEngine, settings);
+ phpLanguage = new AbstractLanguage("php", "PHP") {
+
+ @Override
+ public String[] getFileSuffixes() {
+ return null;
+ }
+ };
+ sensor = new CpdSensor(sonarEngine, sonarBridgeEngine, settings, new ModuleLanguages(settings, new Languages()));
}
@Test
public void test_global_skip() {
settings.setProperty("sonar.cpd.skip", true);
- assertThat(sensor.isSkipped(createJavaProject())).isTrue();
+ assertThat(sensor.isSkipped(Java.INSTANCE)).isTrue();
}
@Test
public void should_not_skip_by_default() {
- assertThat(sensor.isSkipped(createJavaProject())).isFalse();
+ assertThat(sensor.isSkipped(Java.INSTANCE)).isFalse();
}
@Test
public void should_skip_by_language() {
settings.setProperty("sonar.cpd.skip", false);
settings.setProperty("sonar.cpd.php.skip", true);
- assertThat(sensor.isSkipped(createPhpProject())).isTrue();
- assertThat(sensor.isSkipped(createJavaProject())).isFalse();
+
+ assertThat(sensor.isSkipped(phpLanguage)).isTrue();
+ assertThat(sensor.isSkipped(Java.INSTANCE)).isFalse();
}
@Test
public void test_engine() {
- assertThat(sensor.getEngine(createJavaProject())).isSameAs(sonarEngine);
- assertThat(sensor.getEngine(createPhpProject())).isSameAs(sonarBridgeEngine);
- }
-
- private Project createJavaProject() {
- PropertiesConfiguration conf = new PropertiesConfiguration();
- conf.setProperty("sonar.language", "java");
- return new Project("java_project").setConfiguration(conf).setLanguage(Java.INSTANCE);
- }
-
- private Project createPhpProject() {
- PropertiesConfiguration conf = new PropertiesConfiguration();
- conf.setProperty("sonar.language", "php");
- Language phpLanguage = mock(Language.class);
- return new Project("php_project").setConfiguration(conf).setLanguage(phpLanguage);
+ assertThat(sensor.getEngine(Java.INSTANCE)).isSameAs(sonarEngine);
+ assertThat(sensor.getEngine(phpLanguage)).isSameAs(sonarBridgeEngine);
}
}