IJPL-180572 Remove createSession API and refactor session handling logic

GitOrigin-RevId: e07ee8332fe2f6f0aa90748418c3e54cbce6df75
This commit is contained in:
Denis Zaichenko
2025-07-10 14:43:49 +00:00
committed by intellij-monorepo-bot
parent 91074d9acb
commit 3fa0978993
12 changed files with 37 additions and 51 deletions
@@ -3195,7 +3195,6 @@ f:com.intellij.ide.plugins.InstalledPluginsState
- wasUpdated(com.intellij.openapi.extensions.PluginId):Z
- wasUpdatedWithRestart(com.intellij.openapi.extensions.PluginId):Z
c:com.intellij.ide.plugins.InstalledPluginsTableModel
- pf:sessionId:java.util.UUID
- pf:view:java.util.List
- <init>(com.intellij.openapi.project.Project):V
- pf:getEnabledMap():java.util.Map
+2
View File
@@ -229,6 +229,8 @@ f:com.intellij.ide.plugins.DependencyInformation
- hashCode():I
f:com.intellij.ide.plugins.InstalledPluginsState
- getInstalledWithoutRestartPlugins():java.util.Collection
c:com.intellij.ide.plugins.InstalledPluginsTableModel
- pf:mySessionId:java.util.UUID
com.intellij.ide.plugins.PluginEnableStateChangedListener
- a:stateChanged(java.util.Collection,Z):V
f:com.intellij.ide.plugins.PluginInstallCallbackData
@@ -3,6 +3,8 @@ package com.intellij.ide.plugins;
import com.intellij.icons.AllIcons;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.plugins.marketplace.InitSessionResult;
import com.intellij.ide.plugins.newui.DefaultUiPluginManagerController;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -24,30 +26,33 @@ import javax.swing.*;
import java.nio.file.Path;
import java.util.Locale;
import java.util.Set;
import java.util.UUID;
import java.util.function.Consumer;
@ApiStatus.Internal
public class InstallFromDiskAction extends DumbAwareAction {
private static final String PLUGINS_PRESELECTION_PATH = "plugins.preselection.path";
private final @NotNull InstalledPluginsTableModel myTableModel;
private InstalledPluginsTableModel myTableModel;
private final @NotNull PluginEnabler myPluginEnabler;
private final @Nullable JComponent myParentComponent;
@SuppressWarnings({"unused", "ActionPresentationInstantiatedInCtor"})
// called reflectively
InstallFromDiskAction() {
this(new InstalledPluginsTableModel(null), PluginEnabler.HEADLESS, null);
this(null, PluginEnabler.HEADLESS, null);
}
@SuppressWarnings("ActionPresentationInstantiatedInCtor")
protected InstallFromDiskAction(
@NotNull InstalledPluginsTableModel tableModel,
@Nullable InstalledPluginsTableModel tableModel,
@NotNull PluginEnabler pluginEnabler,
@Nullable JComponent parentComponent
) {
super(IdeBundle.messagePointer("action.InstallFromDiskAction.text"), AllIcons.Nodes.Plugin);
myTableModel = tableModel;
if (tableModel != null) {
myTableModel = tableModel;
}
myPluginEnabler = pluginEnabler;
myParentComponent = parentComponent;
}
@@ -70,7 +75,11 @@ public class InstallFromDiskAction extends DumbAwareAction {
public void actionPerformed(@NotNull AnActionEvent e) {
var project = e.getProject();
var file = e.getData(CommonDataKeys.VIRTUAL_FILE);
installPluginFromDisk(file, project, myTableModel, myPluginEnabler, myParentComponent, callbackData -> {
var sessionId = UUID.randomUUID();
//As backend and frontend have their own actions, we don't need a combined state and can use the local one.
InitSessionResult initSessionResult = DefaultUiPluginManagerController.INSTANCE.initSession(sessionId.toString());
var tableModel = myTableModel == null ? new InstalledPluginsTableModel(null, initSessionResult, sessionId) : myTableModel;
installPluginFromDisk(file, project, tableModel, myPluginEnabler, myParentComponent, callbackData -> {
onPluginInstalledFromDisk(callbackData, project);
});
}
@@ -2,8 +2,6 @@
package com.intellij.ide.plugins;
import com.intellij.ide.plugins.marketplace.InitSessionResult;
import com.intellij.ide.plugins.newui.PluginManagerSession;
import com.intellij.ide.plugins.newui.PluginManagerSessionService;
import com.intellij.ide.plugins.newui.PluginUiModel;
import com.intellij.ide.plugins.newui.UiPluginManager;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
@@ -26,15 +24,19 @@ public class InstalledPluginsTableModel {
protected final List<PluginUiModel> view = new ArrayList<>();
private final Map<PluginId, PluginEnabledState> myEnabled = new HashMap<>();
private final @Nullable Project myProject;
protected final UUID mySessionId = UUID.randomUUID();
@ApiStatus.Internal
protected final PluginManagerSession mySession = initializeAndGetSession();
protected final UUID mySessionId;
public InstalledPluginsTableModel(@Nullable Project project) {
this(project, null, UUID.randomUUID());
}
@ApiStatus.Internal
public InstalledPluginsTableModel(@Nullable Project project, @Nullable InitSessionResult initSessionResult, UUID sessionId) {
myProject = project;
InitSessionResult initSessionResult = UiPluginManager.getInstance().initSession(mySessionId);
view.addAll(initSessionResult.getVisiblePluginsList());
initSessionResult.getPluginStates().forEach((pluginId, pluginState) -> {
mySessionId = sessionId;
InitSessionResult session = initSessionResult == null ? UiPluginManager.getInstance().initSession(mySessionId) : initSessionResult;
view.addAll(session.getVisiblePluginsList());
session.getPluginStates().forEach((pluginId, pluginState) -> {
myEnabled.put(pluginId, pluginState != null ? (pluginState ? PluginEnabledState.ENABLED : PluginEnabledState.DISABLED) : null);
});
}
@@ -47,19 +49,6 @@ public class InstalledPluginsTableModel {
return isLoaded(pluginId, getEnabledMap());
}
private PluginManagerSession initializeAndGetSession() {
UiPluginManager.getInstance().createSession(mySessionId);
PluginManagerSession session = PluginManagerSessionService.getInstance().getSession(mySessionId);
if (session == null) {
// Temporary code, until not all code is split. Will be removed soon
// To avoid cases when some methoods are already on the backend and others are still trying to get some state from the backend
// Just an empty session to avoid NPE
// Should not affect any functionality, when registry option is disabled.
return PluginManagerSessionService.getInstance().createSession(mySessionId.toString());
}
return session;
}
private void setEnabled(@NotNull PluginUiModel ideaPluginDescriptor) {
PluginId pluginId = ideaPluginDescriptor.getPluginId();
PluginEnabledState enabled = ideaPluginDescriptor.isEnabled() ? PluginEnabledState.ENABLED : PluginEnabledState.DISABLED;
@@ -9,6 +9,8 @@ import com.intellij.ide.plugins.marketplace.MarketplacePluginDownloadService;
import com.intellij.ide.plugins.marketplace.PluginSignatureChecker;
import com.intellij.ide.plugins.marketplace.statistics.PluginManagerUsageCollector;
import com.intellij.ide.plugins.marketplace.statistics.enums.InstallationSourceEnum;
import com.intellij.ide.plugins.newui.PluginManagerSession;
import com.intellij.ide.plugins.newui.PluginManagerSessionService;
import com.intellij.openapi.application.ApplicationNamesInfo;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.ex.ApplicationInfoEx;
@@ -354,6 +356,12 @@ public final class PluginInstaller {
PluginManagerMain.suggestToEnableInstalledDependantPlugins(pluginEnabler, installedPlugins);
if (!isRestartRequired) {
PluginManagerSession session = PluginManagerSessionService.getInstance().getSession(model.mySessionId.toString());
if (session != null) {
session.getDynamicPluginsToInstall().put(pluginDescriptor.getPluginId(), new PendingDynamicPluginInstall(file, pluginDescriptor));
}
}
callback.accept(new PluginInstallCallbackData(file, pluginDescriptor, isRestartRequired));
for (var callbackData : installedDependencies) {
if (!callbackData.getPluginDescriptor().getPluginId().equals(pluginDescriptor.getPluginId())) {
@@ -54,7 +54,7 @@ object DefaultUiPluginManagerController : UiPluginManagerController {
}
override fun initSession(sessionId: String): InitSessionResult {
val session = findSession(sessionId) ?: return InitSessionResult(emptyList(), emptyMap())
val session = createSession(sessionId)
val applicationInfo = ApplicationInfo.getInstance()
val visiblePlugins = mutableListOf<PluginUiModel>()
for (plugin in getInstalledAndPendingPlugins()) {
@@ -124,8 +124,8 @@ object DefaultUiPluginManagerController : UiPluginManagerController {
}
}
override fun createSession(sessionId: String) {
PluginManagerSessionService.getInstance().createSession(sessionId)
fun createSession(sessionId: String): PluginManagerSession {
return PluginManagerSessionService.getInstance().createSession(sessionId)
}
override fun closeSession(sessionId: String) {
@@ -159,11 +159,6 @@ public class MyPluginModel extends InstalledPluginsTableModel implements PluginE
IdeaPluginDescriptor descriptor = callbackData.getPluginDescriptor();
CheckErrorsResult errors = UiPluginManager.getInstance().getErrors(mySessionId.toString(), descriptor.getPluginId());
appendOrUpdateDescriptor(new PluginUiModelAdapter(descriptor), callbackData.getRestartNeeded(), getErrors(errors));
if (!callbackData.getRestartNeeded() && callbackData.getFile() != null && descriptor instanceof IdeaPluginDescriptorImpl) {
mySession.getDynamicPluginsToInstall().put(descriptor.getPluginId(),
new PendingDynamicPluginInstall(callbackData.getFile(),
(IdeaPluginDescriptorImpl)descriptor));
}
}
public void addComponent(@NotNull ListPluginComponent component) {
@@ -37,10 +37,6 @@ class UiPluginManager {
return getController().getPlugins()
}
fun createSession(uuid: UUID) {
getController().createSession(uuid.toString())
}
fun closeSession(uuid: UUID) {
getController().closeSession(uuid.toString())
}
@@ -38,7 +38,6 @@ interface UiPluginManagerController {
fun loadPluginDetails(model: PluginUiModel): PluginUiModel?
fun loadPluginReviews(pluginId: PluginId, page: Int): List<PluginReviewComment>?
fun loadPluginMetadata(externalPluginId: String): IntellijPluginMetadata?
fun createSession(sessionId: String)
fun closeSession(sessionId: String)
fun uninstallDynamicPlugin(parentComponent: JComponent?, sessionId: String, pluginId: PluginId, isUpdate: Boolean): Boolean
fun deletePluginFiles(pluginId: PluginId)
@@ -121,10 +121,6 @@ class BackendPluginManagerApi : PluginManagerApi {
DefaultUiPluginManagerController.closeSession(sessionId)
}
override suspend fun createSession(sessionId: String) {
DefaultUiPluginManagerController.createSession(sessionId)
}
override suspend fun executeMarketplaceQuery(query: String, count: Int, includeIncompatible: Boolean): PluginSearchResult {
return DefaultUiPluginManagerController.executePluginsSearch(query, count, includeIncompatible)
}
@@ -262,12 +262,6 @@ class BackendUiPluginManagerController() : UiPluginManagerController {
return awaitForResult { PluginManagerApi.getInstance().isNeedUpdate(pluginId) }
}
override fun createSession(sessionId: String) {
awaitForResult {
PluginManagerApi.getInstance().createSession(sessionId)
}
}
override fun closeSession(sessionId: String) {
service<BackendRpcCoroutineContext>().coroutineScope.launch {
PluginManagerApi.getInstance().closeSession(sessionId)
@@ -41,7 +41,6 @@ interface PluginManagerApi : RemoteApi<Unit> {
suspend fun getAllPluginsTags(): Set<String>
suspend fun getAllVendors(): Set<String>
suspend fun updateDescriptorsForInstalledPlugins()
suspend fun createSession(sessionId: String)
suspend fun closeSession(sessionId: String)
suspend fun setEnabledState(sessionId: String, pluginIds: List<PluginId>, enable: Boolean)
suspend fun enablePlugins(sessionId: String, ids: List<PluginId>, bool: Boolean, id: ProjectId?): SetEnabledStateResult