From c58bd2f6643ae63d3f94a81dbe22c60e68340ba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 13 Jan 2021 09:18:28 +0100 Subject: [PATCH] Include JRE version in plugin center url (#1494) --- CHANGELOG.md | 3 +- .../sonia/scm/config/ScmConfiguration.java | 2 +- .../main/java/sonia/scm/util/SystemUtil.java | 6 +- .../java/sonia/scm/plugin/PluginCenter.java | 6 +- .../PluginCenterJreVersionUpdateStep.java | 76 +++++++++++++++++++ .../PluginCenterJreVersionUpdateStepTest.java | 68 +++++++++++++++++ 6 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 scm-webapp/src/main/java/sonia/scm/update/plugin/PluginCenterJreVersionUpdateStep.java create mode 100644 scm-webapp/src/test/java/sonia/scm/update/plugin/PluginCenterJreVersionUpdateStepTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index f70c7d8efa..4ee60d21b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add repository export for Subversion ([#1488](https://github.com/scm-manager/scm-manager/pull/1488)) - Provide more options for Helm chart ([#1485](https://github.com/scm-manager/scm-manager/pull/1485)) - Option to create a permanent link to a source file ([#1489](https://github.com/scm-manager/scm-manager/pull/1489)) -- add markdown codeblock renderer extension point ([#1492](https://github.com/scm-manager/scm-manager/pull/1492)) +- Add markdown codeblock renderer extension point ([#1492](https://github.com/scm-manager/scm-manager/pull/1492)) +- Add Java version to plugin center url ([#1494](https://github.com/scm-manager/scm-manager/pull/1494)) ## [2.12.0] - 2020-12-17 ### Added diff --git a/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java b/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java index dfec682665..910fec675c 100644 --- a/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java +++ b/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java @@ -67,7 +67,7 @@ public class ScmConfiguration implements Configuration { * Default plugin url */ public static final String DEFAULT_PLUGINURL = - "https://plugin-center-api.scm-manager.org/api/v1/plugins/{version}?os={os}&arch={arch}"; + "https://plugin-center-api.scm-manager.org/api/v1/plugins/{version}?os={os}&arch={arch}&jre={jre}"; /** * SCM Manager release feed url diff --git a/scm-core/src/main/java/sonia/scm/util/SystemUtil.java b/scm-core/src/main/java/sonia/scm/util/SystemUtil.java index 0b84760e7c..33cda10260 100644 --- a/scm-core/src/main/java/sonia/scm/util/SystemUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/SystemUtil.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.util; //~--- non-JDK imports -------------------------------------------------------- @@ -94,6 +94,10 @@ public final class SystemUtil return platform.getName(); } + public static String getJre() { + return System.getProperty("java.version"); + } + /** * Method description * diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenter.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenter.java index 74fd6bdc11..2d0e854a03 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenter.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginCenter.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.plugin; import org.slf4j.Logger; @@ -71,9 +71,11 @@ public class PluginCenter { private String buildPluginUrl(String url) { String os = HttpUtil.encode(SystemUtil.getOS()); String arch = SystemUtil.getArch(); + String javaVersion = SystemUtil.getJre(); return url.replace("{version}", context.getVersion()) .replace("{os}", os) - .replace("{arch}", arch); + .replace("{arch}", arch) + .replace("{jre}", javaVersion); } } diff --git a/scm-webapp/src/main/java/sonia/scm/update/plugin/PluginCenterJreVersionUpdateStep.java b/scm-webapp/src/main/java/sonia/scm/update/plugin/PluginCenterJreVersionUpdateStep.java new file mode 100644 index 0000000000..a2e5ed36e4 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/update/plugin/PluginCenterJreVersionUpdateStep.java @@ -0,0 +1,76 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.update.plugin; + +import sonia.scm.config.ScmConfiguration; +import sonia.scm.migration.UpdateStep; +import sonia.scm.plugin.Extension; +import sonia.scm.store.ConfigurationStore; +import sonia.scm.store.ConfigurationStoreFactory; +import sonia.scm.version.Version; + +import javax.inject.Inject; + +import static sonia.scm.util.Util.isEmpty; +import static sonia.scm.version.Version.parse; + +@Extension +public class PluginCenterJreVersionUpdateStep implements UpdateStep { + + private final ConfigurationStoreFactory configurationStoreFactory; + + @Inject + public PluginCenterJreVersionUpdateStep(ConfigurationStoreFactory configurationStoreFactory) { + this.configurationStoreFactory = configurationStoreFactory; + } + + @Override + public void doUpdate() { + ConfigurationStore configurationStore = configurationStoreFactory + .withType(ScmConfiguration.class) + .withName("config") + .build(); + configurationStore.getOptional() + .ifPresent(config -> appendJreVersionParameter(configurationStore, config)); + } + + private void appendJreVersionParameter(ConfigurationStore configurationStore, ScmConfiguration config) { + String oldPluginUrl = config.getPluginUrl(); + if (!isEmpty(oldPluginUrl) && oldPluginUrl.contains("?")&& oldPluginUrl.contains("?os={os}")) { + config.setPluginUrl(oldPluginUrl + "&jre={jre}"); + configurationStore.set(config); + } + } + + @Override + public Version getTargetVersion() { + return parse("2.0.1"); + } + + @Override + public String getAffectedDataType() { + return "sonia.scm.plugin-center"; + } +} diff --git a/scm-webapp/src/test/java/sonia/scm/update/plugin/PluginCenterJreVersionUpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/plugin/PluginCenterJreVersionUpdateStepTest.java new file mode 100644 index 0000000000..b744f57dfd --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/update/plugin/PluginCenterJreVersionUpdateStepTest.java @@ -0,0 +1,68 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.update.plugin; + +import org.junit.jupiter.api.Test; +import sonia.scm.config.ScmConfiguration; +import sonia.scm.store.ConfigurationStore; +import sonia.scm.store.InMemoryConfigurationStoreFactory; + +import static org.assertj.core.api.Assertions.assertThat; +import static sonia.scm.config.ScmConfiguration.DEFAULT_PLUGINURL; + +class PluginCenterJreVersionUpdateStepTest { + + InMemoryConfigurationStoreFactory configurationStoreFactory = new InMemoryConfigurationStoreFactory(); + ConfigurationStore configurationStore = configurationStoreFactory.withType(ScmConfiguration.class).withName("config").build(); + + @Test + void shouldKeepCustomPluginCenterUrl() { + String customPluginUrl = "http://some.old/url"; + mockPluginUrl(customPluginUrl); + + new PluginCenterJreVersionUpdateStep(configurationStoreFactory) + .doUpdate(); + + assertThat(configurationStore.get().getPluginUrl()).isEqualTo(customPluginUrl); + } + + @Test + void shouldUpdatePluginCenterUrlsWithQueryParameters() { + String oldDefaultPluginUrl = "https://plugin-center-api.scm-manager.org/api/v1/plugins/{version}?os={os}&arch={arch}"; + mockPluginUrl(oldDefaultPluginUrl); + + new PluginCenterJreVersionUpdateStep(configurationStoreFactory) + .doUpdate(); + + assertThat(configurationStore.get().getPluginUrl()).isEqualTo(DEFAULT_PLUGINURL); + } + + private void mockPluginUrl(String pluginUrl) { + ScmConfiguration scmConfiguration = new ScmConfiguration(); + scmConfiguration.setPluginUrl(pluginUrl); + configurationStore.set(scmConfiguration); + } + +}