cleanup
[idea/community.git] / platform / projectModel-api / src / com / intellij / openapi / projectRoots / ProjectJdkTable.java
1 // Copyright 2000-2020 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.
2 package com.intellij.openapi.projectRoots;
3
4 import com.intellij.openapi.Disposable;
5 import com.intellij.openapi.application.ApplicationManager;
6 import com.intellij.openapi.application.WriteAction;
7 import com.intellij.openapi.util.Comparing;
8 import com.intellij.openapi.util.Condition;
9 import com.intellij.openapi.util.Disposer;
10 import com.intellij.util.messages.Topic;
11 import org.jetbrains.annotations.ApiStatus;
12 import org.jetbrains.annotations.NotNull;
13 import org.jetbrains.annotations.Nullable;
14 import org.jetbrains.annotations.TestOnly;
15
16 import java.util.EventListener;
17 import java.util.List;
18
19 @ApiStatus.NonExtendable
20 public abstract class ProjectJdkTable {
21   public static ProjectJdkTable getInstance() {
22     return ApplicationManager.getApplication().getService(ProjectJdkTable.class);
23   }
24
25   public abstract @Nullable Sdk findJdk(@NotNull String name);
26
27   public abstract @Nullable Sdk findJdk(@NotNull String name, @NotNull String type);
28
29   public abstract Sdk @NotNull [] getAllJdks();
30
31   public abstract @NotNull List<Sdk> getSdksOfType(@NotNull SdkTypeId type);
32
33   public @Nullable Sdk findMostRecentSdkOfType(@NotNull SdkTypeId type) {
34     return getSdksOfType(type).stream().max(type.versionComparator()).orElse(null);
35   }
36
37   /** @deprecated comparing version strings across SDK types makes no sense; use {@link #findMostRecentSdkOfType} */
38   @Deprecated
39   @ApiStatus.ScheduledForRemoval(inVersion = "2020.3")
40   public Sdk findMostRecentSdk(@NotNull Condition<? super Sdk> condition) {
41     Sdk found = null;
42     for (Sdk each : getAllJdks()) {
43       if (condition.value(each) &&
44           (found == null || Comparing.compare(each.getVersionString(), found.getVersionString()) > 0)) {
45         found = each;
46       }
47     }
48     return found;
49   }
50
51   public abstract void addJdk(@NotNull Sdk jdk);
52
53   @TestOnly
54   public void addJdk(@NotNull Sdk jdk, @NotNull Disposable parentDisposable) {
55     addJdk(jdk);
56     Disposer.register(parentDisposable, () -> WriteAction.runAndWait(()-> removeJdk(jdk)));
57   }
58
59   public abstract void removeJdk(@NotNull Sdk jdk);
60
61   public abstract void updateJdk(@NotNull Sdk originalJdk, @NotNull Sdk modifiedJdk);
62
63   public interface Listener extends EventListener {
64     default void jdkAdded(@NotNull Sdk jdk) {
65     }
66
67     default void jdkRemoved(@NotNull Sdk jdk) {
68     }
69
70     default void jdkNameChanged(@NotNull Sdk jdk, @NotNull String previousName) {
71     }
72   }
73
74   /**
75    * @deprecated Use {@link Listener} directly.
76    */
77   @Deprecated
78   public static class Adapter implements Listener {
79   }
80
81   public abstract @NotNull SdkTypeId getDefaultSdkType();
82
83   public abstract @NotNull SdkTypeId getSdkTypeByName(@NotNull String name);
84
85   public abstract @NotNull Sdk createSdk(@NotNull String name, @NotNull SdkTypeId sdkType);
86
87   /**
88    * This method may automatically detect Sdk if none are configured.
89    */
90   public void preconfigure() {
91   }
92
93   public static final Topic<Listener> JDK_TABLE_TOPIC = Topic.create("Project JDK table", Listener.class);
94 }