diff --git a/src/main/java/run/halo/app/listener/StartedListener.java b/src/main/java/run/halo/app/listener/StartedListener.java index ca8b8f11e1..c9987f5d53 100644 --- a/src/main/java/run/halo/app/listener/StartedListener.java +++ b/src/main/java/run/halo/app/listener/StartedListener.java @@ -74,7 +74,6 @@ public void onApplicationEvent(ApplicationStartedEvent event) { private void printStartInfo() { String blogUrl = optionService.getBlogBaseUrl(); - log.info(AnsiOutput.toString(AnsiColor.BRIGHT_BLUE, "Halo started at ", blogUrl)); log.info(AnsiOutput.toString(AnsiColor.BRIGHT_BLUE, "Halo admin started at ", blogUrl, "/", haloProperties.getAdminPath())); if (!haloProperties.isDocDisabled()) { @@ -149,7 +148,7 @@ private void initThemes() { log.debug("Skipped copying theme folder due to existence of theme folder"); } } catch (Exception e) { - throw new RuntimeException("Initialize internal theme to user path error", e); + log.error("Initialize internal theme to user path error!", e); } } @@ -188,7 +187,6 @@ private void initDirectory() { Files.createDirectories(dataExportPath); log.info("Created data export directory: [{}]", dataExportPath); } - } catch (IOException ie) { throw new RuntimeException("Failed to initialize directories", ie); } diff --git a/src/main/java/run/halo/app/model/support/HaloConst.java b/src/main/java/run/halo/app/model/support/HaloConst.java index 7ab107abb1..0cd8832926 100644 --- a/src/main/java/run/halo/app/model/support/HaloConst.java +++ b/src/main/java/run/halo/app/model/support/HaloConst.java @@ -3,6 +3,7 @@ import org.springframework.http.HttpHeaders; import java.io.File; +import java.util.Optional; /** *
@@ -139,6 +140,12 @@ public class HaloConst { * Version constant. (Available in production environment) */ public static final String HALO_VERSION; + + /** + * Unknown version: unknown + */ + public static final String UNKNOWN_VERSION = "unknown"; + /** * Database product name. */ @@ -150,6 +157,6 @@ public class HaloConst { static { // Set version - HALO_VERSION = HaloConst.class.getPackage().getImplementationVersion(); + HALO_VERSION = Optional.ofNullable(HaloConst.class.getPackage().getImplementationVersion()).orElse(UNKNOWN_VERSION); } } diff --git a/src/main/java/run/halo/app/utils/VersionUtil.java b/src/main/java/run/halo/app/utils/VersionUtil.java index 659922f96f..fa54c49c30 100644 --- a/src/main/java/run/halo/app/utils/VersionUtil.java +++ b/src/main/java/run/halo/app/utils/VersionUtil.java @@ -1,43 +1,63 @@ package run.halo.app.utils; -import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; +import run.halo.app.model.support.HaloConst; +import java.util.Objects; import java.util.StringTokenizer; /** * @author ryanwang * @date 2020-02-03 - * @see com.sun.xml.internal.ws.util.VersionUtil + * @see "com.sun.xml.internal.ws.util.VersionUtil" */ +@Slf4j public class VersionUtil { - public VersionUtil() { + private static final String UNDERLINE = "_"; + + private VersionUtil() { } public static int[] getCanonicalVersion(String version) { + Assert.hasText(version, "Version must not be blank"); + + if (Objects.equals(version, HaloConst.UNKNOWN_VERSION)) { + log.warn("Unknown version will be converted to {}.{}.{}.{}", + Integer.MAX_VALUE, + Integer.MAX_VALUE, + Integer.MAX_VALUE, + Integer.MAX_VALUE); + return new int[] {Integer.MAX_VALUE, + Integer.MAX_VALUE, + Integer.MAX_VALUE, + Integer.MAX_VALUE}; + } + int[] canonicalVersion = new int[] {1, 1, 0, 0}; StringTokenizer tokenizer = new StringTokenizer(version, "."); String token = tokenizer.nextToken(); canonicalVersion[0] = Integer.parseInt(token); token = tokenizer.nextToken(); StringTokenizer subTokenizer; - if (!token.contains(StrUtil.UNDERLINE)) { + if (!token.contains(UNDERLINE)) { canonicalVersion[1] = Integer.parseInt(token); } else { - subTokenizer = new StringTokenizer(token, "_"); + subTokenizer = new StringTokenizer(token, UNDERLINE); canonicalVersion[1] = Integer.parseInt(subTokenizer.nextToken()); canonicalVersion[3] = Integer.parseInt(subTokenizer.nextToken()); } if (tokenizer.hasMoreTokens()) { token = tokenizer.nextToken(); - if (!token.contains(StrUtil.UNDERLINE)) { + if (!token.contains(UNDERLINE)) { canonicalVersion[2] = Integer.parseInt(token); if (tokenizer.hasMoreTokens()) { canonicalVersion[3] = Integer.parseInt(tokenizer.nextToken()); } } else { - subTokenizer = new StringTokenizer(token, "_"); + subTokenizer = new StringTokenizer(token, UNDERLINE); canonicalVersion[2] = Integer.parseInt(subTokenizer.nextToken()); canonicalVersion[3] = Integer.parseInt(subTokenizer.nextToken()); } @@ -47,6 +67,8 @@ public static int[] getCanonicalVersion(String version) { } public static int compare(String version1, String version2) { + log.debug("Comparing version [{}] with [{}]", version1, version2); + int[] canonicalVersion1 = getCanonicalVersion(version1); int[] canonicalVersion2 = getCanonicalVersion(version2); if (canonicalVersion1[0] < canonicalVersion2[0]) { diff --git a/src/test/java/run/halo/app/utils/VersionUtilTest.java b/src/test/java/run/halo/app/utils/VersionUtilTest.java index b0323d2085..36cd846046 100644 --- a/src/test/java/run/halo/app/utils/VersionUtilTest.java +++ b/src/test/java/run/halo/app/utils/VersionUtilTest.java @@ -1,26 +1,45 @@ package run.halo.app.utils; -import org.junit.Assert; -import org.junit.Test; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.Test; +import run.halo.app.model.support.HaloConst; + +import static org.junit.jupiter.api.Assertions.*; /** * @author ryanwang * @date 2020-02-03 */ -public class VersionUtilTest { +class VersionUtilTest { @Test - public void compareVersion() { - Assert.assertTrue(VersionUtil.compareVersion("1.2.0", "1.1.1")); - - Assert.assertTrue(VersionUtil.compareVersion("1.2.1", "1.2.0")); - - Assert.assertTrue(VersionUtil.compareVersion("1.2.0", "1.1.1.0")); - - Assert.assertTrue(VersionUtil.compareVersion("1.2.0", "0.4.4")); + void compareVersion() { + assertTrue(VersionUtil.compareVersion("1.2.0", "1.1.1")); + assertTrue(VersionUtil.compareVersion("1.2.1", "1.2.0")); + assertTrue(VersionUtil.compareVersion("1.2.0", "1.1.1.0")); + assertTrue(VersionUtil.compareVersion("1.2.0", "0.4.4")); + assertFalse(VersionUtil.compareVersion("1.1.1", "1.2.0")); + assertFalse(VersionUtil.compareVersion("0.0.1", "1.2.0")); + } - Assert.assertFalse(VersionUtil.compareVersion("1.1.1", "1.2.0")); + @Test + void unknownVersionCompareTest() { + // build a random version + String randomVersion = String.join(".", + RandomStringUtils.randomNumeric(1), + RandomStringUtils.randomNumeric(2), + RandomStringUtils.randomNumeric(3)); + VersionUtil.compareVersion(HaloConst.UNKNOWN_VERSION, randomVersion); + } - Assert.assertFalse(VersionUtil.compareVersion("0.0.1", "1.2.0")); + @Test + void unknownOrEmptyCanonicalVersionTest() { + assertThrows(IllegalArgumentException.class, () -> VersionUtil.getCanonicalVersion(null)); + int[] version = VersionUtil.getCanonicalVersion(HaloConst.UNKNOWN_VERSION); + assertNotNull(version); + assertEquals(4, version.length); + for (int v : version) { + assertEquals(Integer.MAX_VALUE, v); + } } } \ No newline at end of file