From b2a226a6d373a6ba38a889c194947f27e7eceef5 Mon Sep 17 00:00:00 2001 From: Eugene Petrenko Date: Tue, 17 Dec 2019 13:33:51 +0100 Subject: [PATCH] UnknownSdkTracker - configure local SDK, simplify code, enforce SDK name GitOrigin-RevId: e9fb321dceeb768dbc6685fb4c0236c9661d8be5 --- .../projectRoots/impl/UnknownSdkTracker.java | 70 ++++++++++++------- .../projectRoot/SdkDownloadTracker.java | 2 +- 2 files changed, 45 insertions(+), 27 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/UnknownSdkTracker.java b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/UnknownSdkTracker.java index 2c4131f44bc2..4504b8956da0 100644 --- a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/UnknownSdkTracker.java +++ b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/UnknownSdkTracker.java @@ -132,41 +132,43 @@ public class UnknownSdkTracker { return; } - Sdk sdk = ProjectJdkTable.getInstance().createSdk(info.getSdkName(), info.getSdkType()); - { - SdkModificator mod = sdk.getSdkModificator(); - mod.setHomePath(task.getPlannedHomeDir()); - mod.setVersionString(task.getPlannedVersion()); - mod.commitChanges(); - } - ApplicationManager.getApplication().invokeLater(() -> { + Disposable lifetime = Disposer.newDisposable(); + Disposer.register(project,lifetime); + + Sdk sdk = createSdkPrototype(info); + SdkDownloadTracker downloadTracker = SdkDownloadTracker.getInstance(); downloadTracker.registerSdkDownload(sdk, task); - downloadTracker.tryRegisterDownloadingListener(sdk, Disposer.newDisposable(), new ProgressIndicatorBase(), succeeded -> { + downloadTracker.tryRegisterDownloadingListener(sdk, lifetime, new ProgressIndicatorBase(), succeeded -> { if (succeeded) { - WriteAction.run(() -> ProjectJdkTable.getInstance().addJdk(sdk)); + registerNewSdkInJdkTable(info, sdk); } + Disposer.dispose(lifetime); }); + downloadTracker.startSdkDownloadIfNeeded(sdk); }); } private static void configureLocalSdks(@NotNull Map localFixes) { - ProjectJdkTable jdkTable = ProjectJdkTable.getInstance(); for (Map.Entry e : localFixes.entrySet()) { MissingSdkInfo info = e.getKey(); LocalSdkFix fix = e.getValue(); - Sdk sdk = jdkTable.createSdk(info.getSdkName(), info.getSdkType()); - { - SdkModificator mod = sdk.getSdkModificator(); - mod.setHomePath(FileUtil.toSystemIndependentName(fix.getExistingSdkHome())); - mod.setVersionString(fix.getVersionString()); - mod.commitChanges(); + Sdk sdk = createSdkPrototype(info); + SdkModificator mod = sdk.getSdkModificator(); + mod.setHomePath(FileUtil.toSystemIndependentName(fix.getExistingSdkHome())); + mod.setVersionString(fix.getVersionString()); + mod.commitChanges(); + + try { + info.getSdkType().setupSdkPaths(sdk); + } catch (Exception error) { + LOG.warn("Failed to setupPaths for " + sdk + ". " + error.getMessage(), error); } - WriteAction.run(() -> jdkTable.addJdk(sdk)); + registerNewSdkInJdkTable(info, sdk); LOG.info("Automatically set Sdk " + info.getSdkName() + " to " + fix.getExistingSdkHome()); } } @@ -397,14 +399,8 @@ public class UnknownSdkTracker { @Override public void sdkAdded(@NotNull Sdk sdk) { //it is easier and safer than committing the ProjectSdksModel instance - WriteAction.run(() -> { - SdkModificator mod = sdk.getSdkModificator(); - mod.setName(info.getSdkName()); - mod.commitChanges(); - - ProjectJdkTable.getInstance().addJdk(sdk); - wasSdkCreated.set(true); - }); + registerNewSdkInJdkTable(info, sdk); + wasSdkCreated.set(true); } }); @@ -471,4 +467,26 @@ public class UnknownSdkTracker { } } } + + @NotNull + private static Sdk createSdkPrototype(@NotNull MissingSdkInfo info) { + return ProjectJdkTable.getInstance().createSdk(info.getSdkName(), info.getSdkType()); + } + + private static void registerNewSdkInJdkTable(@NotNull MissingSdkInfo info, @NotNull Sdk sdk) { + WriteAction.run(() -> { + ProjectJdkTable table = ProjectJdkTable.getInstance(); + Sdk clash = table.findJdk(info.getSdkName()); + if (clash != null) { + LOG.warn("SDK with name " + info.getSdkName() + " already exists: clash=" + clash + ", new=" + sdk); + return; + } + + SdkModificator mod = sdk.getSdkModificator(); + mod.setName(info.getSdkName()); + mod.commitChanges(); + + table.addJdk(sdk); + }); + } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/SdkDownloadTracker.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/SdkDownloadTracker.java index da01585fcd4c..29ee56c8114d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/SdkDownloadTracker.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/projectRoot/SdkDownloadTracker.java @@ -334,7 +334,7 @@ public class SdkDownloadTracker implements Disposable { getInstance().removeTask(this); //collections may change from the callbacks new ArrayList<>(myCompleteListeners).forEach(it -> it.consume(succeeded)); - new ArrayList<>(myDisposables).forEach(Disposable::dispose); + new ArrayList<>(myDisposables).forEach(it -> Disposer.dispose(it)); } void cancel() {