diff --git a/java/idea-ui/resources/messages/JavaUiBundle.properties b/java/idea-ui/resources/messages/JavaUiBundle.properties index c533014fc470..41c7a8146432 100644 --- a/java/idea-ui/resources/messages/JavaUiBundle.properties +++ b/java/idea-ui/resources/messages/JavaUiBundle.properties @@ -280,8 +280,6 @@ settings.remote.repo.Maven.Repository.URL=maven Repository URL project.roots.tooltip.library.has.broken.paths=Library ''{0}'' has broken {1, choice, 1#path|2#paths}. project.sdk.not.defined=Project JDK is not defined module.sdk.not.defined=Module JDK is not defined -project.sdk.not.valid=Project JDK \"{0}\" is not found on the disk or corrupted -module.sdk.not.valid=Module JDK \"{0}\" is not found on the disk or corrupted label.enter.artifact.name=Enter artifact name: project.new.wizard.import.title=Import {0} from external &model library.name.already.exists.error=Library \"{0}\" already exists diff --git a/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/JavaProjectSdkSetupValidator.java b/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/JavaProjectSdkSetupValidator.java index 7b5fa068194e..a986cb0137ce 100644 --- a/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/JavaProjectSdkSetupValidator.java +++ b/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/JavaProjectSdkSetupValidator.java @@ -5,38 +5,25 @@ import com.intellij.codeInsight.daemon.ProjectSdkSetupValidator; import com.intellij.ide.JavaUiBundle; import com.intellij.ide.highlighter.JavaClassFileType; import com.intellij.lang.java.JavaLanguage; -import com.intellij.openapi.application.WriteAction; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Editor; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; -import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.JavaSdk; import com.intellij.openapi.projectRoots.JavaSdkType; import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.projectRoots.SdkModificator; -import com.intellij.openapi.projectRoots.impl.UnknownSdkTracker; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ui.configuration.SdkPopupBuilder; import com.intellij.openapi.roots.ui.configuration.SdkPopupFactory; -import com.intellij.openapi.roots.ui.configuration.projectRoot.SdkDownloadTracker; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; -import com.intellij.ui.EditorNotificationPanel; import com.intellij.ui.EditorNotificationPanel.ActionHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.event.HyperlinkEvent; - /** * @author Pavel.Dolgov */ public class JavaProjectSdkSetupValidator implements ProjectSdkSetupValidator { - private static final Logger LOG = Logger.getInstance(JavaProjectSdkSetupValidator.class); - public static final JavaProjectSdkSetupValidator INSTANCE = new JavaProjectSdkSetupValidator(); @Override @@ -50,118 +37,37 @@ public class JavaProjectSdkSetupValidator implements ProjectSdkSetupValidator { return false; } - private static class ContextInfo { - final Module module; - final Sdk sdk; - - final String sdkName; - final boolean isSdkDownloading; - final boolean isSdkInheritedFromProject; - - private ContextInfo(@NotNull Project project, @NotNull VirtualFile file) { - module = ModuleUtilCore.findModuleForFile(file, project); - sdk = module != null && !module.isDisposed() ? ModuleRootManager.getInstance(module).getSdk() : null; - isSdkDownloading = sdk != null && SdkDownloadTracker.getInstance().isDownloading(sdk); - isSdkInheritedFromProject = module != null && ModuleRootManager.getInstance(module).isSdkInherited(); - sdkName = sdk != null ? sdk.getName() : ""; - } - - boolean isSdkMissing() { - return module != null && sdk == null; - } - - boolean isUsingInvalidSdk() { - if (module == null) return false; - if (sdk == null || isSdkDownloading) return false; - - //we only check out SDK types (e.g. Kotlin SDK can be different) - if (!sdk.getSdkType().equals(JavaSdk.getInstance())) return false; - - try { - //we run a cheap test that uses VFS inside to check if JDK home exists - return !JavaSdk.getInstance().sdkHasValidPath(sdk); - } - catch (ProcessCanceledException e) { - throw e; - } - catch (Exception e) { - LOG.warn("Failed to check JDK " + sdk.getName() + " with home " + sdk.getHomePath() + ". " + e.getMessage(), e); - //we failed checking it, assume it's OK to avoid false positives - return false; - } - } - } - @Nullable @Override public String getErrorMessage(@NotNull Project project, @NotNull VirtualFile file) { - ContextInfo info = new ContextInfo(project, file); - - if (info.isSdkMissing()) { - if (info.isSdkInheritedFromProject) { - return JavaUiBundle.message("project.sdk.not.defined"); - } - else { - return JavaUiBundle.message("module.sdk.not.defined"); - } - } - - if (info.isUsingInvalidSdk()) { - if (info.isSdkInheritedFromProject) { - return JavaUiBundle.message("project.sdk.not.valid", info.sdkName); - } - else { - return JavaUiBundle.message("module.sdk.not.valid", info.sdkName); + final Module module = ModuleUtilCore.findModuleForFile(file, project); + if (module != null && !module.isDisposed()) { + final Sdk sdk = ModuleRootManager.getInstance(module).getSdk(); + if (sdk == null) { + if (ModuleRootManager.getInstance(module).isSdkInherited()) { + return JavaUiBundle.message("project.sdk.not.defined"); + } + else { + return JavaUiBundle.message("module.sdk.not.defined"); + } } } return null; } - @Nullable + @NotNull private static SdkPopupBuilder preparePopup(@NotNull Project project, @NotNull VirtualFile file) { - ContextInfo info = new ContextInfo(project, file); - - SdkPopupBuilder builder = SdkPopupFactory + return SdkPopupFactory .newBuilder() .withProject(project) - .withSdkTypeFilter(type -> type instanceof JavaSdkType); - - if (info.isSdkMissing()) { - return builder.updateSdkForFile(file); - } - - Sdk sdk = info.sdk; - if (info.isUsingInvalidSdk() && sdk != null) { - return builder - .withSdkFilter(it -> !it.getName().equalsIgnoreCase(sdk.getName())) - .onSdkSelected( newSdk -> { - //if the selected SDK is downloading, let's have our's updated at the end too - SdkDownloadTracker.getInstance().registerEditableSdk(newSdk, sdk); - - WriteAction.run(() -> { - SdkModificator mod = sdk.getSdkModificator(); - mod.setHomePath(newSdk.getHomePath()); - mod.setVersionString(newSdk.getVersionString()); - mod.commitChanges(); - - if (!SdkDownloadTracker.getInstance().isDownloading(newSdk)) { - JavaSdk.getInstance().setupSdkPaths(sdk); - } - }); - - UnknownSdkTracker.getInstance(project).updateUnknownSdks(); - }); - } - - return null; + .withSdkTypeFilter(type -> type instanceof JavaSdkType) + .updateSdkForFile(file); } @NotNull @Override public ActionHandler getFixHandler(@NotNull Project project, @NotNull VirtualFile file) { - SdkPopupBuilder builder = preparePopup(project, file); - if (builder == null) return NOOP; - return builder.buildEditorNotificationPanelHandler(); + return preparePopup(project, file).buildEditorNotificationPanelHandler(); } /** @@ -172,19 +78,6 @@ public class JavaProjectSdkSetupValidator implements ProjectSdkSetupValidator { @SuppressWarnings("deprecation") public void doFix(@NotNull Project project, @NotNull VirtualFile file) { //implemented for backward compatibility with the older code - SdkPopupBuilder builder = preparePopup(project, file); - if (builder == null) return; - - builder.buildPopup().showInFocusCenter(); + preparePopup(project, file).buildPopup().showInFocusCenter(); } - - private static final EditorNotificationPanel.ActionHandler NOOP = new EditorNotificationPanel.ActionHandler() { - @Override - public void handlePanelActionClick(@NotNull EditorNotificationPanel panel, @NotNull HyperlinkEvent event) { - } - - @Override - public void handleQuickFixClick(@NotNull Editor editor, @NotNull PsiFile psiFile) { - } - }; }