From 835594e57abf8d4bc32f3b9caa6f9faf23d4fe7b Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 5 Dec 2018 17:36:27 +0100 Subject: [PATCH] [java] ignores incomplete version strings for JDKs defined programmatically (IDEA-203014) --- .../openapi/projectRoots/impl/JavaSdkImpl.java | 4 +++- .../openapi/projectRoots/JavaSdkVersionTest.java | 13 +++++++++++-- .../jps/model/java/JdkVersionDetector.java | 9 ++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java index 2784e77e0b12..cec586cf489b 100644 --- a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java +++ b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java @@ -331,7 +331,9 @@ public class JavaSdkImpl extends JavaSdk { String path = home.replace(File.separatorChar, '/'); sdkModificator.setHomePath(path); - sdkModificator.setVersionString(jdkName); // must be set after home path, otherwise setting home path clears the version string + if (JdkVersionDetector.isVersionString(jdkName)) { + sdkModificator.setVersionString(jdkName); // must be set after home path, otherwise setting home path clears the version string + } File jdkHomeFile = new File(home); addClasses(jdkHomeFile, sdkModificator, isJre); diff --git a/java/java-tests/testSrc/com/intellij/java/openapi/projectRoots/JavaSdkVersionTest.java b/java/java-tests/testSrc/com/intellij/java/openapi/projectRoots/JavaSdkVersionTest.java index 7ccaf1c7519e..dcb8a65b4d9f 100644 --- a/java/java-tests/testSrc/com/intellij/java/openapi/projectRoots/JavaSdkVersionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/openapi/projectRoots/JavaSdkVersionTest.java @@ -3,10 +3,11 @@ package com.intellij.java.openapi.projectRoots; import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.pom.java.LanguageLevel; +import com.intellij.util.lang.JavaVersion; +import org.jetbrains.jps.model.java.JdkVersionDetector; import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import static org.junit.Assert.*; public class JavaSdkVersionTest { @Test @@ -37,4 +38,12 @@ public class JavaSdkVersionTest { assertEquals(JavaSdkVersion.JDK_1_9, JavaSdkVersion.fromVersionString("java version \"9-ea\"")); assertEquals(JavaSdkVersion.JDK_1_9, JavaSdkVersion.fromVersionString("java version \"9.1.2\"")); } + + @Test + public void versionStringDetectorSanity() { + assertTrue(JdkVersionDetector.isVersionString("java version \"9\"")); + assertFalse(JdkVersionDetector.isVersionString("java version \"\"")); + + assertTrue(JdkVersionDetector.isVersionString(JdkVersionDetector.formatVersionString(JavaVersion.compose(9)))); + } } \ No newline at end of file diff --git a/jps/model-api/src/org/jetbrains/jps/model/java/JdkVersionDetector.java b/jps/model-api/src/org/jetbrains/jps/model/java/JdkVersionDetector.java index ac0a6d2e9bfa..ada54bad3ff7 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/java/JdkVersionDetector.java +++ b/jps/model-api/src/org/jetbrains/jps/model/java/JdkVersionDetector.java @@ -1,9 +1,8 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - */ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.jps.model.java; import com.intellij.openapi.util.Bitness; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.lang.JavaVersion; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -76,4 +75,8 @@ public abstract class JdkVersionDetector { public static String formatVersionString(@NotNull JavaVersion version) { return "java version \"" + version + '"'; } + + public static boolean isVersionString(@NotNull String string) { + return string.length() >= 16 && string.startsWith("java version \"") && StringUtil.endsWithChar(string, '"'); + } } \ No newline at end of file