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 9da10b39e6d4..ec1e3817ad70 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 @@ -48,7 +48,8 @@ public class JavaSdkImpl extends JavaSdk { private static final String VM_EXE_NAME = "java"; // do not use JavaW.exe for Windows because of issues with encoding - private final Map myCachedSdkHomeToVersion = new ConcurrentHashMap<>(); + private final Map myCachedSdkHomeToVersionString = new ConcurrentHashMap<>(); + private final Map myCachedVersionStringToJdkVersion = new ConcurrentHashMap<>(); public JavaSdkImpl(final VirtualFileManager fileManager, final FileTypeManager fileTypeManager) { super("JavaSDK"); @@ -72,7 +73,9 @@ public class JavaSdkImpl extends JavaSdk { private void updateCache(VirtualFileEvent event) { if (FileTypes.ARCHIVE.equals(fileTypeManager.getFileTypeByFileName(event.getFileName()))) { String filePath = event.getFile().getPath(); - myCachedSdkHomeToVersion.keySet().removeIf(sdkHome -> FileUtil.isAncestor(sdkHome, filePath, false)); + if (myCachedSdkHomeToVersionString.keySet().removeIf(sdkHome -> FileUtil.isAncestor(sdkHome, filePath, false))) { + myCachedVersionStringToJdkVersion.clear(); + } } } }); @@ -195,7 +198,7 @@ public class JavaSdkImpl extends JavaSdk { @Override public String suggestSdkName(String currentSdkName, String sdkHome) { - JavaVersion version = getJavaVersion(sdkHome); + JavaVersion version = JavaVersion.tryParse(getVersionString(sdkHome)); if (version == null) return currentSdkName; StringBuilder suggested = new StringBuilder(); @@ -280,24 +283,19 @@ public class JavaSdkImpl extends JavaSdk { modificator.addRoot(root, annoType); } - @Nullable - private JavaVersion getJavaVersion(String sdkHome) { - return myCachedSdkHomeToVersion.computeIfAbsent(sdkHome, k -> { + @Override + public final String getVersionString(String sdkHome) { + return myCachedSdkHomeToVersionString.computeIfAbsent(sdkHome, k -> { JdkVersionDetector.JdkVersionInfo jdkInfo = SdkVersionUtil.getJdkVersionInfo(k); - return jdkInfo != null ? jdkInfo.version : null; + return jdkInfo != null ? JdkVersionDetector.formatVersionString(jdkInfo.version) : null; }); } - @Override - public final String getVersionString(String sdkHome) { - JavaVersion version = getJavaVersion(sdkHome); - return version != null ? JdkVersionDetector.formatVersionString(version) : null; - } - @Override public JavaSdkVersion getVersion(@NotNull Sdk sdk) { - JavaVersion version = getJavaVersion(sdk.getHomePath()); - return version != null ? JavaSdkVersion.fromJavaVersion(version) : null; + String versionString = sdk.getVersionString(); + return versionString == null ? null : + myCachedVersionStringToJdkVersion.computeIfAbsent(versionString, JavaSdkVersion::fromVersionString); } @Override diff --git a/java/testFramework/src/com/intellij/testFramework/IdeaTestUtil.java b/java/testFramework/src/com/intellij/testFramework/IdeaTestUtil.java index e6d1a6094d20..19c81eca7224 100644 --- a/java/testFramework/src/com/intellij/testFramework/IdeaTestUtil.java +++ b/java/testFramework/src/com/intellij/testFramework/IdeaTestUtil.java @@ -23,6 +23,7 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; +import org.junit.Assert; import org.junit.Assume; import java.io.File; @@ -157,19 +158,18 @@ public class IdeaTestUtil extends PlatformTestUtil { } @TestOnly - public static void setTestVersion(@NotNull final JavaSdkVersion testVersion, @NotNull Module module, @NotNull Disposable parentDisposable) { - ModuleRootManager rootManager = ModuleRootManager.getInstance(module); - final Sdk sdk = rootManager.getSdk(); - final String oldVersionString = sdk.getVersionString(); + public static void setTestVersion(@NotNull JavaSdkVersion testVersion, @NotNull Module module, @NotNull Disposable parentDisposable) { + Sdk sdk = ModuleRootManager.getInstance(module).getSdk(); + Assert.assertNotNull(sdk); + String oldVersionString = sdk.getVersionString(); // hack ((SdkModificator)sdk).setVersionString(testVersion.getDescription()); - //assert JavaSdk.getInstance().getVersion(sdk) == testVersion; + Assert.assertSame(testVersion, JavaSdk.getInstance().getVersion(sdk)); Disposer.register(parentDisposable, () -> ((SdkModificator)sdk).setVersionString(oldVersionString)); } - @NotNull public static String requireRealJdkHome() { String javaHome = SystemProperties.getJavaHome(); @@ -180,7 +180,8 @@ public class IdeaTestUtil extends PlatformTestUtil { return path; } } + //noinspection ConstantConditions Assume.assumeTrue("Cannot find JDK, checked paths: " + paths, false); return null; } -} +} \ No newline at end of file