From 08de7bc30c13fdd63d8e4342a57f4b67d7c15aa9 Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Tue, 21 Jan 2014 14:55:24 +0100 Subject: SONAR-926 Multi-language support: * RulesProfile wrapper * ModuleFileSystem now support multi language * Sensors executed trying each language until one is found --- .../main/java/org/sonar/plugins/cpd/CpdSensor.java | 41 ++++++++++++---------- .../java/org/sonar/plugins/cpd/CpdSensorTest.java | 41 ++++++++++------------ 2 files changed, 42 insertions(+), 40 deletions(-) (limited to 'plugins/sonar-cpd-plugin') 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); } } -- cgit v1.2.3