From 8529e6c4e7de4d29a5cb1be30b5705911b0d298e Mon Sep 17 00:00:00 2001 From: StarBlues Date: Fri, 1 Apr 2022 15:47:54 +0800 Subject: [PATCH] fix version bug --- .../starblues/core/DefaultPluginManager.java | 19 ++-- .../checker/DefaultPluginLauncherChecker.java | 9 +- .../core/version/SemverVersionInspector.java | 21 +++++ .../core/version/VersionInspector.java | 11 ++- .../DefaultPluginLauncherCheckerTest.java | 94 +++++++++++++++++++ .../version/SemverVersionInspectorTest.java | 65 +++++++++++++ 6 files changed, 208 insertions(+), 11 deletions(-) create mode 100644 spring-brick/src/test/java/com/gitee/starblues/core/checker/DefaultPluginLauncherCheckerTest.java create mode 100644 spring-brick/src/test/java/com/gitee/starblues/core/version/SemverVersionInspectorTest.java diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java b/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java index ec4027c..edc7292 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/DefaultPluginManager.java @@ -299,7 +299,7 @@ public class DefaultPluginManager implements PluginManager{ } // 检查插件版本 PluginDescriptor upgradePluginDescriptor = upgradePlugin.getPluginDescriptor(); - checkVersion(oldPlugin.getPluginDescriptor().getPluginVersion(), upgradePluginDescriptor.getPluginVersion()); + checkVersion(oldPlugin.getPluginDescriptor(), upgradePluginDescriptor); if(oldPlugin.getPluginState() == PluginState.STARTED){ // 如果插件被启动, 则卸载旧的插件 uninstall(pluginId); @@ -408,6 +408,8 @@ public class DefaultPluginManager implements PluginManager{ if(resolvedPlugins.containsKey(pluginId)){ throw new PluginException(pluginInsideInfo.getPluginDescriptor(), "已经被加载"); } + // 检查当前插件版本号是否合法 + provider.getVersionInspector().check(pluginInsideInfo.getPluginDescriptor().getPluginVersion()); resolvedPlugins.put(pluginId, pluginInsideInfo); LogUtils.info(log, pluginInsideInfo.getPluginDescriptor(), "加载成功"); return pluginInsideInfo; @@ -600,14 +602,15 @@ public class DefaultPluginManager implements PluginManager{ /** * 检查比较插件版本 - * @param oldPluginVersion 旧插件版本 - * @param newPluginVersion 新插件版本 + * @param oldPlugin 旧插件信息 + * @param newPlugin 新插件信息 */ - protected void checkVersion(String oldPluginVersion, String newPluginVersion){ - int compareVersion = provider.getVersionInspector().compareTo(oldPluginVersion, newPluginVersion); - if(compareVersion <= 0){ - throw new PluginException("插件包版本[" + newPluginVersion + "]必须大于:" - + oldPluginVersion); + protected void checkVersion(PluginDescriptor oldPlugin, PluginDescriptor newPlugin){ + int compareVersion = provider.getVersionInspector().compareTo(oldPlugin.getPluginVersion(), + newPlugin.getPluginVersion()); + if(compareVersion >= 0){ + throw new PluginException("新插件包版本[" + MsgUtils.getPluginUnique(newPlugin) + "]必须大于" + + "旧插件版本[" + MsgUtils.getPluginUnique(oldPlugin) + "]"); } } diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/checker/DefaultPluginLauncherChecker.java b/spring-brick/src/main/java/com/gitee/starblues/core/checker/DefaultPluginLauncherChecker.java index d93de10..6284a0b 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/checker/DefaultPluginLauncherChecker.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/checker/DefaultPluginLauncherChecker.java @@ -20,9 +20,11 @@ import com.gitee.starblues.common.Constants; import com.gitee.starblues.core.PluginInfo; import com.gitee.starblues.core.PluginState; import com.gitee.starblues.core.RealizeProvider; +import com.gitee.starblues.core.descriptor.PluginDescriptor; import com.gitee.starblues.core.exception.PluginDisabledException; import com.gitee.starblues.core.exception.PluginException; import com.gitee.starblues.integration.IntegrationConfiguration; +import com.gitee.starblues.utils.MsgUtils; import com.gitee.starblues.utils.ObjectUtils; /** @@ -75,12 +77,15 @@ public class DefaultPluginLauncherChecker implements PluginLauncherChecker { String requires = pluginInfo.getPluginDescriptor().getRequires(); boolean exactVersion = configuration.exactVersion(); int compareVersion = realizeProvider.getVersionInspector().compareTo(requires, version); + PluginDescriptor descriptor = pluginInfo.getPluginDescriptor(); if(exactVersion && compareVersion != 0){ - String error = "需要安装到[" + requires + "]版本的主程序, 但当前主程序版本为[" + version + "]"; + String error = "插件[" + MsgUtils.getPluginUnique(descriptor) + "]" + + "只能安装到[" + requires + "]版本的主程序, 但当前主程序版本为[" + version + "]"; throw new PluginException(pluginInfo.getPluginDescriptor(), error); } if(compareVersion > 0){ - String error = "需要安装到小于等于[" + requires + "]版本的主程序, 但当前主程序版本为[" + version + "]"; + String error = "插件[" + MsgUtils.getPluginUnique(descriptor) + "]" + + "只能安装到小于等于[" + requires + "]版本的主程序, 但当前主程序版本为[" + version + "]"; throw new PluginException(pluginInfo.getPluginDescriptor(), error); } } diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/version/SemverVersionInspector.java b/spring-brick/src/main/java/com/gitee/starblues/core/version/SemverVersionInspector.java index 22c1e5c..1c79f18 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/version/SemverVersionInspector.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/version/SemverVersionInspector.java @@ -16,6 +16,9 @@ package com.gitee.starblues.core.version; +import com.gitee.starblues.core.exception.PluginException; +import com.gitee.starblues.utils.ObjectUtils; +import com.github.zafarkhaja.semver.UnexpectedCharacterException; import com.github.zafarkhaja.semver.Version; /** @@ -25,8 +28,26 @@ import com.github.zafarkhaja.semver.Version; */ public class SemverVersionInspector implements VersionInspector{ + @Override + public void check(String version) throws PluginException { + try { + Version.valueOf(version); + } catch (Throwable e){ + String message = e.toString(); + if(ObjectUtils.isEmpty(message)){ + message = ""; + } else { + message = ": " + message; + } + throw new PluginException("版本号[" + version + "]非法" + message); + } + } + @Override public int compareTo(String version1, String version2) { + check(version1); + check(version2); + Version v1 = Version.valueOf(version1); Version v2 = Version.valueOf(version2); return v1.compareTo(v2); diff --git a/spring-brick/src/main/java/com/gitee/starblues/core/version/VersionInspector.java b/spring-brick/src/main/java/com/gitee/starblues/core/version/VersionInspector.java index be6a573..48e9ede 100644 --- a/spring-brick/src/main/java/com/gitee/starblues/core/version/VersionInspector.java +++ b/spring-brick/src/main/java/com/gitee/starblues/core/version/VersionInspector.java @@ -16,6 +16,8 @@ package com.gitee.starblues.core.version; +import com.gitee.starblues.core.exception.PluginException; + /** * 版本检查 * @author starBlues @@ -23,13 +25,20 @@ package com.gitee.starblues.core.version; */ public interface VersionInspector { + /** + * 检查插件版本号是否合法 + * @param version 版本号 + * @throws PluginException 版本号不合法则抛出异常 + */ + void check(String version) throws PluginException; /** * 比较 v1 和 v2版本. * @param v1 版本号码1 * @param v2 版本号码2 * @return 如果 v1大于等于v2, 则返回大于等于0的数字, 否则返回小于0的数字 + * @throws PluginException 版本号不合法则抛出异常 */ - int compareTo(String v1, String v2); + int compareTo(String v1, String v2) throws PluginException;; } diff --git a/spring-brick/src/test/java/com/gitee/starblues/core/checker/DefaultPluginLauncherCheckerTest.java b/spring-brick/src/test/java/com/gitee/starblues/core/checker/DefaultPluginLauncherCheckerTest.java new file mode 100644 index 0000000..09d895d --- /dev/null +++ b/spring-brick/src/test/java/com/gitee/starblues/core/checker/DefaultPluginLauncherCheckerTest.java @@ -0,0 +1,94 @@ +/** + * Copyright [2019-2022] [starBlues] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.starblues.core.checker; + +import com.gitee.starblues.core.DefaultPluginInsideInfo; +import com.gitee.starblues.core.PluginInfo; +import com.gitee.starblues.core.PluginState; +import com.gitee.starblues.core.RealizeProvider; +import com.gitee.starblues.core.descriptor.DefaultInsidePluginDescriptor; +import com.gitee.starblues.core.descriptor.InsidePluginDescriptor; +import com.gitee.starblues.core.exception.PluginException; +import com.gitee.starblues.core.version.SemverVersionInspector; +import com.gitee.starblues.integration.IntegrationConfiguration; +import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.io.File; +import java.nio.file.Path; + +import static org.powermock.api.mockito.PowerMockito.*; +/** + * 测试 DefaultPluginLauncherChecker + * + * @author starBlues + * @version 3.0.0 + */ +@RunWith(PowerMockRunner.class) +public class DefaultPluginLauncherCheckerTest extends TestCase { + + private DefaultPluginLauncherChecker launcherChecker; + + @Mock + private RealizeProvider realizeProvider; + @Mock + private IntegrationConfiguration configuration; + + @Before + public void setUp(){ + launcherChecker = spy(new DefaultPluginLauncherChecker(realizeProvider, configuration)); + } + + @Test + public void test_checkCanStart_start(){ + DefaultPluginInsideInfo pluginInfo = getPluginInfo(); + pluginInfo.setPluginState(PluginState.STARTED); + + when(configuration.isDisabled(Mockito.anyString())).thenReturn(false); + when(configuration.isEnable(Mockito.anyString())).thenReturn(true); + + try { + launcherChecker.checkCanStart(pluginInfo); + } catch (Exception e){ + assertTrue(e instanceof PluginException); + } + } + + + private DefaultPluginInsideInfo getPluginInfo(){ + String pluginId = "pluginId"; + String version = "1.0.0"; + String pluginClass = "pluginClass"; + Path pluginPath = mock(Path.class); + Path pluginPath2 = mock(Path.class); + when(pluginPath.toAbsolutePath()).thenReturn(pluginPath2); + when(pluginPath2.toString()).thenReturn("path"); + + File file = mock(File.class); + when(pluginPath.toFile()).thenReturn(file); + when(file.getName()).thenReturn("file.jar"); + InsidePluginDescriptor descriptor = new DefaultInsidePluginDescriptor(pluginId, version, pluginClass, pluginPath); + + return new DefaultPluginInsideInfo(descriptor); + } + +} \ No newline at end of file diff --git a/spring-brick/src/test/java/com/gitee/starblues/core/version/SemverVersionInspectorTest.java b/spring-brick/src/test/java/com/gitee/starblues/core/version/SemverVersionInspectorTest.java new file mode 100644 index 0000000..c8e87d7 --- /dev/null +++ b/spring-brick/src/test/java/com/gitee/starblues/core/version/SemverVersionInspectorTest.java @@ -0,0 +1,65 @@ +/** + * Copyright [2019-2022] [starBlues] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gitee.starblues.core.version; + +import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.powermock.api.mockito.PowerMockito.*; + +/** + * SemverVersionInspectorTest 单元测试 + * + * @author starBlues + * @version 3.0.0 + */ +@RunWith(PowerMockRunner.class) +public class SemverVersionInspectorTest extends TestCase { + + private SemverVersionInspector versionInspector; + + + @Before + public void setUp(){ + versionInspector = spy(new SemverVersionInspector()); + } + + @Test + public void test_equal(){ + assertEquals(0, versionInspector.compareTo("1.0.0", "1.0.0")); + assertEquals(0, versionInspector.compareTo("1.0.0-SNAPSHOT", "1.0.0-SNAPSHOT")); + } + + @Test + public void test_greater(){ + assertTrue(versionInspector.compareTo("2.0.0", "1.0.0") > 0); + assertTrue(versionInspector.compareTo("2.0.0-SNAPSHOT", "1.0.0-SNAPSHOT") > 0); + assertTrue(versionInspector.compareTo("2.0.2", "1.2.0") > 0); + assertTrue(versionInspector.compareTo("1.2.2", "1.2.0") > 0); + } + + @Test + public void test_less(){ + assertTrue(versionInspector.compareTo("1.0.0", "2.0.0") <= 0); + assertTrue(versionInspector.compareTo("1.0.0-SNAPSHOT", "2.0.0-SNAPSHOT") <= 0); + } + + +} \ No newline at end of file -- Gitee