diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2016-06-13 17:12:39 +0200 |
---|---|---|
committer | Julien HENRY <henryju@yahoo.fr> | 2016-07-07 10:04:36 +0200 |
commit | e5818438a289fe522c87245d5bd18d71406f0e39 (patch) | |
tree | 86df13d673acd62016bc8253593bca0154934162 /sonar-plugin-api | |
parent | 2d20c0f3f27356ad1f9aa430f3e5925c50756cfc (diff) | |
download | sonarqube-e5818438a289fe522c87245d5bd18d71406f0e39.tar.gz sonarqube-e5818438a289fe522c87245d5bd18d71406f0e39.zip |
SONAR-7755 deploy/plugins/index.txt should expose SonarLint compatibility
Diffstat (limited to 'sonar-plugin-api')
12 files changed, 196 insertions, 67 deletions
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/Plugin.java b/sonar-plugin-api/src/main/java/org/sonar/api/Plugin.java index aa1a6f9511a..8fb50a0b14c 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/Plugin.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/Plugin.java @@ -85,21 +85,19 @@ import static java.util.Objects.requireNonNull; public interface Plugin { class Context { - private final Version runtimeApiVersion; + private final SonarRuntime sonarRuntime; private final List extensions = new ArrayList(); - private final boolean sonarlintRuntime; - public Context(Version runtimeApiVersion, boolean sonarlintRuntime) { - this.runtimeApiVersion = runtimeApiVersion; - this.sonarlintRuntime = sonarlintRuntime; + public Context(SonarRuntime sonarRuntime) { + this.sonarRuntime = sonarRuntime; } /** - * @deprecated since 6.0 + * @deprecated since 6.0 use {@link #getRuntimeApiVersion()} */ @Deprecated public Version getSonarQubeVersion() { - return runtimeApiVersion; + return sonarRuntime.getApiVersion(); } /** @@ -107,7 +105,7 @@ public interface Plugin { * @since 6.0 */ public Version getRuntimeApiVersion() { - return runtimeApiVersion; + return sonarRuntime.getApiVersion(); } /** @@ -154,11 +152,11 @@ public interface Plugin { } /** - * Test if plugin is currently executed in SonarLint. Can be use to conditionnaly add some extensions. + * Test the product the plugin is currently executed in. This can allow to implement a different behavior. * @since 6.0 */ - public boolean isSonarlintRuntime() { - return sonarlintRuntime; + public SonarProduct getRuntimeProduct() { + return sonarRuntime.getProduct(); } } diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/RuntimeApiVersionTest.java b/sonar-plugin-api/src/main/java/org/sonar/api/SonarProduct.java index e7fb658e2eb..97a5dba1e37 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/RuntimeApiVersionTest.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/SonarProduct.java @@ -19,27 +19,13 @@ */ package org.sonar.api; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.sonar.api.utils.Version; - -import static org.assertj.core.api.Assertions.assertThat; - -public class RuntimeApiVersionTest { - - @Rule - public ExpectedException expectedException = ExpectedException.none(); +/** + * List of different products/runtimes. + * @since 6.0 + */ +public enum SonarProduct { - @Test - public void isGte() { - Version version = Version.parse("1.2.3"); - RuntimeApiVersion apiVersion = new RuntimeApiVersion(version, false); - assertThat(apiVersion.get()).isEqualTo(version); - assertThat(apiVersion.isSonarlintRuntime()).isFalse(); - assertThat(apiVersion.isGreaterThanOrEqual(version)).isTrue(); - assertThat(apiVersion.isGreaterThanOrEqual(Version.parse("1.1"))).isTrue(); - assertThat(apiVersion.isGreaterThanOrEqual(Version.parse("1.3"))).isFalse(); - } + SONARQUBE, + SONARLINT; } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/SonarQubeSide.java b/sonar-plugin-api/src/main/java/org/sonar/api/SonarQubeSide.java new file mode 100644 index 00000000000..5e02c2eae61 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/SonarQubeSide.java @@ -0,0 +1,32 @@ +/* + * 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.api; + +/** + * Differentiate runtime context in SonarQube product. + * @since 6.0 + */ +public enum SonarQubeSide { + + SCANNER, + SERVER, + COMPUTE_ENGINE; + +} diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/SonarQubeVersion.java b/sonar-plugin-api/src/main/java/org/sonar/api/SonarQubeVersion.java index 6b8a1e5cdbd..044df52a450 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/SonarQubeVersion.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/SonarQubeVersion.java @@ -19,6 +19,7 @@ */ package org.sonar.api; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import org.sonar.api.batch.ScannerSide; import org.sonar.api.batch.sensor.Sensor; @@ -115,17 +116,21 @@ import org.sonar.api.utils.Version; * * * @since 5.5 - * @deprecated since 6.0 replaced by {@link RuntimeApiVersion} + * @deprecated since 6.0 replaced by {@link SonarRuntime} */ @ScannerSide @ServerSide @ComputeEngineSide @Immutable @Deprecated -public class SonarQubeVersion extends RuntimeApiVersion { +public class SonarQubeVersion extends SonarRuntime { - public SonarQubeVersion(Version version, boolean sonarlint) { - super(version, sonarlint); + public SonarQubeVersion(Version version, SonarProduct product, @Nullable SonarQubeSide sonarQubeSide) { + super(version, product, sonarQubeSide); + } + + public Version get() { + return super.getApiVersion(); } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/RuntimeApiVersion.java b/sonar-plugin-api/src/main/java/org/sonar/api/SonarRuntime.java index e221f6f9f8e..0760fb77244 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/RuntimeApiVersion.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/SonarRuntime.java @@ -19,12 +19,15 @@ */ package org.sonar.api; +import com.google.common.base.Preconditions; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import org.sonar.api.batch.BatchSide; import org.sonar.api.batch.sensor.Sensor; import org.sonar.api.ce.ComputeEngineSide; import org.sonar.api.server.ServerSide; import org.sonar.api.utils.Version; +import org.sonarsource.api.sonarlint.SonarLintSide; import static java.util.Objects.requireNonNull; @@ -121,8 +124,9 @@ import static java.util.Objects.requireNonNull; @BatchSide @ServerSide @ComputeEngineSide +@SonarLintSide @Immutable -public class RuntimeApiVersion { +public class SonarRuntime { /** * Constant for version 5.5 @@ -134,16 +138,28 @@ public class RuntimeApiVersion { */ public static final Version V5_6 = Version.create(5, 6); + /** + * Constant for version 6.0 + */ + public static final Version V6_0 = Version.create(6, 0); + private final Version version; - private final boolean sonarlint; + private final SonarProduct product; + private final SonarQubeSide sonarQubeSide; - public RuntimeApiVersion(Version version, boolean sonarlint) { + public SonarRuntime(Version version, SonarProduct product, @Nullable SonarQubeSide sonarQubeSide) { requireNonNull(version); + requireNonNull(product); + Preconditions.checkArgument((product == SonarProduct.SONARQUBE) == (sonarQubeSide != null), "sonarQubeSide should be provided only for SonarQube product"); this.version = version; - this.sonarlint = sonarlint; + this.product = product; + this.sonarQubeSide = sonarQubeSide; } - public Version get() { + /** + * Runtime version of sonar-plugin-api. This could be used to test if a new feature can be used or not without using reflection. + */ + public Version getApiVersion() { return this.version; } @@ -152,10 +168,23 @@ public class RuntimeApiVersion { } /** - * @since 6.0 Test if current runtime is SonarLint. Can be used to implement a different behavior. + * Allow to know what is current runtime product. Can be used to implement different behavior depending on runtime (SonarQube, SonarLint, ...). + * @since 6.0 + */ + public SonarProduct getProduct() { + return product; + } + + /** + * Allow to know the precise runtime context in SonarQube product. Only valid when {@link #getProduct()} returns {@link SonarProduct#SONARQUBE} + * @since 6.0 + * @throws UnsupportedOperationException if called and {@link #getProduct()} is not equal to {@link SonarProduct#SONARQUBE} */ - public boolean isSonarlintRuntime() { - return sonarlint; + public SonarQubeSide getSonarQubeSide() { + if (sonarQubeSide == null) { + throw new UnsupportedOperationException("Can only be called in SonarQube"); + } + return sonarQubeSide; } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/SensorContext.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/SensorContext.java index 4970132e71a..22319fb4613 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/SensorContext.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/SensorContext.java @@ -20,6 +20,7 @@ package org.sonar.api.batch.sensor; import java.io.Serializable; +import org.sonar.api.SonarProduct; import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputModule; import org.sonar.api.batch.rule.ActiveRules; @@ -75,10 +76,10 @@ public interface SensorContext { Version getRuntimeApiVersion(); /** - * Test if plugin is currently executed in SonarLint. This can allow to implement a different behavior. + * Test the product the plugin is currently executed in. This can allow to implement a different behavior. * @since 6.0 */ - boolean isSonarLintRuntime(); + SonarProduct getRuntimeProduct(); // ----------- MEASURES -------------- diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/internal/SensorContextTester.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/internal/SensorContextTester.java index 9c3c8476028..53a66952c17 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/internal/SensorContextTester.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/internal/SensorContextTester.java @@ -30,6 +30,8 @@ import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.CheckForNull; +import org.sonar.api.SonarProduct; +import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarQubeVersion; import org.sonar.api.batch.fs.InputModule; import org.sonar.api.batch.fs.TextRange; @@ -58,7 +60,7 @@ import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure; import org.sonar.api.batch.sensor.symbol.NewSymbolTable; import org.sonar.api.batch.sensor.symbol.internal.DefaultSymbolTable; import org.sonar.api.config.Settings; -import org.sonar.api.internal.RuntimeApiVersionFactory; +import org.sonar.api.internal.SonarRuntimeFactory; import org.sonar.api.measures.Metric; import org.sonar.api.utils.System2; import org.sonar.api.utils.Version; @@ -95,7 +97,7 @@ public class SensorContextTester implements SensorContext { this.activeRules = new ActiveRulesBuilder().build(); this.sensorStorage = new InMemorySensorStorage(); this.module = new DefaultInputModule("projectKey"); - this.sqVersion = RuntimeApiVersionFactory.create(System2.INSTANCE, false); + this.sqVersion = SonarRuntimeFactory.create(System2.INSTANCE, SonarProduct.SONARQUBE, SonarQubeSide.SCANNER); } public static SensorContextTester create(File moduleBaseDir) { @@ -142,21 +144,21 @@ public class SensorContextTester implements SensorContext { */ @Override public Version getSonarQubeVersion() { - return sqVersion.get(); + return sqVersion.getApiVersion(); } @Override public Version getRuntimeApiVersion() { - return sqVersion.get(); + return sqVersion.getApiVersion(); } @Override - public boolean isSonarLintRuntime() { - return sqVersion.isSonarlintRuntime(); + public SonarProduct getRuntimeProduct() { + return sqVersion.getProduct(); } - public SensorContextTester setRuntime(Version version, boolean isSonarLint) { - this.sqVersion = new SonarQubeVersion(version, isSonarLint); + public SensorContextTester setRuntime(Version version, SonarProduct product, SonarQubeSide sonarQubeSide) { + this.sqVersion = new SonarQubeVersion(version, product, sonarQubeSide); return this; } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/internal/RuntimeApiVersionFactory.java b/sonar-plugin-api/src/main/java/org/sonar/api/internal/SonarRuntimeFactory.java index fd098bd4a64..b47189b58a8 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/internal/RuntimeApiVersionFactory.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/internal/SonarRuntimeFactory.java @@ -23,6 +23,9 @@ import com.google.common.io.Resources; import java.io.IOException; import java.net.URL; import java.nio.charset.StandardCharsets; +import javax.annotation.Nullable; +import org.sonar.api.SonarProduct; +import org.sonar.api.SonarQubeSide; import org.sonar.api.SonarQubeVersion; import org.sonar.api.utils.System2; import org.sonar.api.utils.Version; @@ -30,19 +33,19 @@ import org.sonar.api.utils.Version; /** * For internal use only. */ -public class RuntimeApiVersionFactory { +public class SonarRuntimeFactory { private static final String FILE_PATH = "/sq-version.txt"; - private RuntimeApiVersionFactory() { + private SonarRuntimeFactory() { // prevents instantiation } - public static SonarQubeVersion create(System2 system, boolean isSonarLint) { + public static SonarQubeVersion create(System2 system, SonarProduct product, @Nullable SonarQubeSide sonarQubeSide) { try { URL url = system.getResource(FILE_PATH); String versionInFile = Resources.toString(url, StandardCharsets.UTF_8); - return new SonarQubeVersion(Version.parse(versionInFile), isSonarLint); + return new SonarQubeVersion(Version.parse(versionInFile), product, sonarQubeSide); } catch (IOException e) { throw new IllegalStateException("Can not load " + FILE_PATH + " from classpath", e); } diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/PluginTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/PluginTest.java index 853a48bd59c..caa022c0290 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/PluginTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/PluginTest.java @@ -23,13 +23,13 @@ import java.util.Arrays; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.sonar.api.RuntimeApiVersion.V5_5; +import static org.sonar.api.SonarRuntime.V5_5; public class PluginTest { @Test public void test_context() { - Plugin.Context context = new Plugin.Context(V5_5, true); + Plugin.Context context = new Plugin.Context(new SonarRuntime(V5_5, SonarProduct.SONARQUBE, SonarQubeSide.SERVER)); assertThat(context.getSonarQubeVersion()).isEqualTo(V5_5); assertThat(context.getExtensions()).isEmpty(); diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/SonarQubeVersionTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/SonarQubeVersionTest.java index e5ef829db69..8ee63aa98fd 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/SonarQubeVersionTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/SonarQubeVersionTest.java @@ -34,9 +34,8 @@ public class SonarQubeVersionTest { @Test public void isGte() { Version version = Version.parse("1.2.3"); - SonarQubeVersion qubeVersion = new SonarQubeVersion(version, true); + SonarQubeVersion qubeVersion = new SonarQubeVersion(version, SonarProduct.SONARLINT, null); assertThat(qubeVersion.get()).isEqualTo(version); - assertThat(qubeVersion.isSonarlintRuntime()).isTrue(); assertThat(qubeVersion.isGreaterThanOrEqual(version)).isTrue(); assertThat(qubeVersion.isGreaterThanOrEqual(Version.parse("1.1"))).isTrue(); assertThat(qubeVersion.isGreaterThanOrEqual(Version.parse("1.3"))).isFalse(); diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/SonarRuntimeTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/SonarRuntimeTest.java new file mode 100644 index 00000000000..6d26a5678ce --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/SonarRuntimeTest.java @@ -0,0 +1,73 @@ +/* + * 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.api; + +import org.assertj.core.api.Assertions; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.api.utils.Version; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SonarRuntimeTest { + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Test + public void isGteInSQ() { + Version version = Version.parse("1.2.3"); + SonarRuntime apiVersion = new SonarRuntime(version, SonarProduct.SONARQUBE, SonarQubeSide.SCANNER); + assertThat(apiVersion.getApiVersion()).isEqualTo(version); + assertThat(apiVersion.getProduct()).isEqualTo(SonarProduct.SONARQUBE); + assertThat(apiVersion.getSonarQubeSide()).isEqualTo(SonarQubeSide.SCANNER); + assertThat(apiVersion.isGreaterThanOrEqual(version)).isTrue(); + assertThat(apiVersion.isGreaterThanOrEqual(Version.parse("1.1"))).isTrue(); + assertThat(apiVersion.isGreaterThanOrEqual(Version.parse("1.3"))).isFalse(); + } + + @Test + public void inSL() { + Version version = Version.parse("1.2.3"); + SonarRuntime apiVersion = new SonarRuntime(version, SonarProduct.SONARLINT, null); + assertThat(apiVersion.getApiVersion()).isEqualTo(version); + assertThat(apiVersion.getProduct()).isEqualTo(SonarProduct.SONARLINT); + assertThat(apiVersion.isGreaterThanOrEqual(version)).isTrue(); + assertThat(apiVersion.isGreaterThanOrEqual(Version.parse("1.1"))).isTrue(); + assertThat(apiVersion.isGreaterThanOrEqual(Version.parse("1.3"))).isFalse(); + try { + apiVersion.getSonarQubeSide(); + Assertions.fail("Expected exception"); + } catch (Exception e) { + assertThat(e).isInstanceOf(UnsupportedOperationException.class); + } + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructorMissSide() throws Exception { + new SonarRuntime(Version.parse("1.2.3"), SonarProduct.SONARQUBE, null); + } + + @Test(expected = IllegalArgumentException.class) + public void testConstructorNoSideOnSonarLint() throws Exception { + new SonarRuntime(Version.parse("1.2.3"), SonarProduct.SONARLINT, SonarQubeSide.COMPUTE_ENGINE); + } +} diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/internal/RuntimeApiVersionFactoryTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/internal/SonarRuntimeFactoryTest.java index 69b3cca8c54..4db26447ca5 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/internal/RuntimeApiVersionFactoryTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/internal/SonarRuntimeFactoryTest.java @@ -23,6 +23,7 @@ import java.io.File; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.sonar.api.SonarProduct; import org.sonar.api.SonarQubeVersion; import org.sonar.api.utils.System2; @@ -31,17 +32,17 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; -public class RuntimeApiVersionFactoryTest { +public class SonarRuntimeFactoryTest { @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void create() { - SonarQubeVersion version = RuntimeApiVersionFactory.create(System2.INSTANCE, true); + SonarQubeVersion version = SonarRuntimeFactory.create(System2.INSTANCE, SonarProduct.SONARLINT, null); assertThat(version).isNotNull(); - assertThat(version.get().major()).isGreaterThanOrEqualTo(5); - assertThat(version.isSonarlintRuntime()).isTrue(); + assertThat(version.getApiVersion().major()).isGreaterThanOrEqualTo(5); + assertThat(version.getProduct()).isEqualTo(SonarProduct.SONARLINT); } @Test @@ -51,7 +52,7 @@ public class RuntimeApiVersionFactoryTest { System2 system = spy(System2.class); when(system.getResource(anyString())).thenReturn(new File("target/unknown").toURI().toURL()); - RuntimeApiVersionFactory.create(system, false); + SonarRuntimeFactory.create(system, SonarProduct.SONARLINT, null); } } |