From 7839d203ef8c25a7067d3186a7e0e6d0adac73d6 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Tue, 11 Jun 2019 06:39:27 -0400 Subject: [PATCH] loadAndOpenProject - accept File and VirtualFile to reduce usages of unclear strings in tests GitOrigin-RevId: 77b3a5ca43a720be0be4c759909412404bdff880 --- .../roots/UnloadedModulesConfigurationTest.kt | 21 +--- .../project/impl/ProjectManagerImpl.java | 101 ++++++++++-------- .../impl/LightFileTemplatesTest.java | 2 +- .../module/ModulesConfigurationTest.java | 8 +- .../project/impl/JBNavigateCommandTest.kt | 2 +- .../project/impl/ProjectOpeningTest.java | 2 +- .../project/impl/RecentProjectsTest.java | 4 +- .../openapi/project/ProjectManager.java | 15 ++- 8 files changed, 83 insertions(+), 72 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/roots/UnloadedModulesConfigurationTest.kt b/java/java-tests/testSrc/com/intellij/roots/UnloadedModulesConfigurationTest.kt index 389dcfdb117c..feec15cb5a04 100644 --- a/java/java-tests/testSrc/com/intellij/roots/UnloadedModulesConfigurationTest.kt +++ b/java/java-tests/testSrc/com/intellij/roots/UnloadedModulesConfigurationTest.kt @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2019 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. package com.intellij.roots import com.intellij.openapi.application.ex.PathManagerEx @@ -24,6 +10,7 @@ import com.intellij.openapi.project.impl.ProjectManagerImpl import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.util.io.FileUtil +import com.intellij.openapi.util.io.FileUtilRt import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.testFramework.ModuleTestCase import java.io.File @@ -33,7 +20,7 @@ import java.io.File */ class UnloadedModulesConfigurationTest : ModuleTestCase() { fun `test load project`() { - val projectPath = File(PathManagerEx.getTestDataPath(), "moduleRootManager/unloadedModules").absolutePath + val projectPath = FileUtilRt.toSystemIndependentName(File(PathManagerEx.getTestDataPath(), "moduleRootManager/unloadedModules").absolutePath) val project = getProjectManager().loadAndOpenProject(projectPath)!! try { val moduleManager = ModuleManager.getInstance(project) @@ -41,7 +28,7 @@ class UnloadedModulesConfigurationTest : ModuleTestCase() { assertEquals(2, moduleManager.unloadedModuleDescriptions.size) val util = moduleManager.unloadedModuleDescriptions.find { it.name == "util" }!! - val projectDirUrl = VfsUtilCore.pathToUrl(FileUtil.toSystemIndependentName(projectPath)) + val projectDirUrl = VfsUtilCore.pathToUrl(projectPath) assertEquals("$projectDirUrl/util", assertOneElement(util.contentRoots).url) assertEmpty(util.dependencyModuleNames) diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java index d95d6226e332..ba0c6cdcd525 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java @@ -34,7 +34,10 @@ import com.intellij.openapi.project.*; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.*; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.ShutDownTracker; +import com.intellij.openapi.util.UserDataHolderEx; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.vfs.LocalFileSystem; @@ -187,7 +190,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { ProjectImpl project = doCreateProject(projectName, filePath); try { - initProject(filePath, project, useDefaultProjectSettings ? getDefaultProject() : null); + initProject(filePath, project, useDefaultProjectSettings ? getDefaultProject() : null, ProgressManager.getInstance().getProgressIndicator()); if (LOG_PROJECT_LEAKAGE_IN_TESTS) { myProjects.put(project, null); } @@ -264,9 +267,8 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { return (int)myProjects.keySet().stream().filter(project -> project.isDisposed() && !((ProjectImpl)project).isTemporarilyDisposed()).count(); } - private static void initProject(@NotNull @SystemIndependent String filePath, @NotNull ProjectImpl project, @Nullable Project template) { + private static void initProject(@NotNull @SystemIndependent String filePath, @NotNull ProjectImpl project, @Nullable Project template, @Nullable ProgressIndicator indicator) { LOG.assertTrue(!project.isDefault()); - ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); if (indicator != null) { indicator.setIndeterminate(false); // getting project name is not cheap and not possible at this moment @@ -298,7 +300,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { @NotNull protected ProjectImpl doCreateProject(@Nullable String projectName, @NotNull String filePath) { Activity activity = StartUpMeasurer.start(StartUpMeasurer.Phases.PROJECT_INSTANTIATION); - ProjectImpl project = new ProjectImpl(FileUtilRt.toSystemIndependentName(filePath), projectName); + ProjectImpl project = new ProjectImpl(filePath, projectName); activity.end(); return project; } @@ -315,7 +317,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { try { String normalizedFilePath = FileUtilRt.toSystemIndependentName(new File(filePath).getAbsolutePath()); ProjectImpl project = doCreateProject(projectName, normalizedFilePath); - initProject(normalizedFilePath, project, null); + initProject(normalizedFilePath, project, null, ProgressManager.getInstance().getProgressIndicator()); return project; } catch (Throwable t) { @@ -518,9 +520,23 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { } @Override - public Project loadAndOpenProject(@NotNull final String originalFilePath) { - final String filePath = FileUtilRt.toSystemIndependentName(toCanonicalName(originalFilePath)); - final VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByPath(filePath); + public Project loadAndOpenProject(@NotNull String originalFilePath) { + String filePath = FileUtilRt.toSystemIndependentName(toCanonicalName(originalFilePath)); + return loadAndOpenProject(LocalFileSystem.getInstance().findFileByPath(filePath), filePath); + } + + @Override + public Project loadAndOpenProject(@NotNull VirtualFile virtualFile) { + return loadAndOpenProject(virtualFile, virtualFile.getPath()); + } + + @Override + public Project loadAndOpenProject(@NotNull File file) { + VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByIoFile(file); + return loadAndOpenProject(virtualFile, Objects.requireNonNull(virtualFile).getPath()); + } + + private Project loadAndOpenProject(@Nullable VirtualFile virtualFile, @NotNull @SystemIndependent String filePath) { final ConversionResult conversionResult = virtualFile == null ? null : ConversionService.getInstance().convert(virtualFile); ProjectImpl project; if (conversionResult != null && conversionResult.openingIsCanceled()) { @@ -528,24 +544,29 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { } else { project = doCreateProject(null, filePath); - TransactionGuard.getInstance().submitTransactionAndWait(() -> ProgressManager.getInstance().run(new Task.Modal(project, ProjectBundle.message("project.load.progress"), true) { - @Override - public void run(@NotNull ProgressIndicator indicator) { - try { - if (!loadProjectWithProgress(filePath, project)) { + //noinspection CodeBlock2Expr + TransactionGuard.getInstance().submitTransactionAndWait(() -> { + ProgressManager.getInstance().run(new Task.Modal(project, ProjectBundle.message("project.load.progress"), true) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + try { + initProject(filePath, project, null, indicator); + } + catch (ProcessCanceledException e) { return; } + catch (Throwable e) { + LOG.error(e); + return; + } + + if (conversionResult != null && !conversionResult.conversionNotNeeded()) { + StartupManager.getInstance(project).registerPostStartupActivity(() -> conversionResult.postStartupActivity(project)); + } + openProject(project); } - catch (Throwable e) { - LOG.error(e); - return; - } - if (conversionResult != null && !conversionResult.conversionNotNeeded()) { - StartupManager.getInstance(project).registerPostStartupActivity(() -> conversionResult.postStartupActivity(project)); - } - openProject(project); - } - })); + }); + }); } if (project == null) { @@ -581,33 +602,27 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { String filePath = path.getPath(); ProjectImpl project = doCreateProject(null, filePath); - if (!loadProjectWithProgress(filePath, project)) { + try { + if (!ApplicationManager.getApplication().isDispatchThread() && ProgressManager.getInstance().getProgressIndicator() != null) { + initProject(filePath, project, null, ProgressManager.getInstance().getProgressIndicator()); + } + else { + //noinspection CodeBlock2Expr + ProgressManager.getInstance().runProcessWithProgressSynchronously(() -> { + initProject(filePath, project, null, ProgressManager.getInstance().getProgressIndicator()); + }, ProjectBundle.message("project.load.progress"), canCancelProjectLoading(), project); + } + } + catch (ProcessCanceledException e) { return null; } + if (!conversionResult.conversionNotNeeded()) { StartupManager.getInstance(project).registerPostStartupActivity(() -> conversionResult.postStartupActivity(project)); } return project; } - private static boolean loadProjectWithProgress(@NotNull @SystemIndependent String filePath, @NotNull ProjectImpl project) { - try { - if (!ApplicationManager.getApplication().isDispatchThread() && - ProgressManager.getInstance().getProgressIndicator() != null) { - initProject(filePath, project, null); - return true; - } - ProgressManager.getInstance().runProcessWithProgressSynchronously((ThrowableComputable)() -> { - initProject(filePath, project, null); - return project; - }, ProjectBundle.message("project.load.progress"), canCancelProjectLoading(), project); - return true; - } - catch (ProcessCanceledException e) { - return false; - } - } - private static void notifyProjectOpenFailed() { Application application = ApplicationManager.getApplication(); application.getMessageBus().syncPublisher(AppLifecycleListener.TOPIC).projectOpenFailed(); diff --git a/platform/platform-tests/testSrc/com/intellij/ide/fileTemplates/impl/LightFileTemplatesTest.java b/platform/platform-tests/testSrc/com/intellij/ide/fileTemplates/impl/LightFileTemplatesTest.java index 4ffe2a33fd83..b0fcf2b65046 100644 --- a/platform/platform-tests/testSrc/com/intellij/ide/fileTemplates/impl/LightFileTemplatesTest.java +++ b/platform/platform-tests/testSrc/com/intellij/ide/fileTemplates/impl/LightFileTemplatesTest.java @@ -117,7 +117,7 @@ public class LightFileTemplatesTest extends LightPlatformTestCase { PlatformTestUtil.saveProject(project, true); closeProject(project); - reloaded = ProjectManager.getInstance().loadAndOpenProject(foo.getPath()); + reloaded = ProjectManager.getInstance().loadAndOpenProject(foo); assertNotNull(reloaded); manager = FileTemplateManager.getInstance(reloaded); assertThat(manager.getCurrentScheme()).isEqualTo(manager.getProjectScheme()); diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/module/ModulesConfigurationTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/module/ModulesConfigurationTest.java index c37fa4f778e1..285f9c003cd3 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/module/ModulesConfigurationTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/module/ModulesConfigurationTest.java @@ -27,14 +27,14 @@ public class ModulesConfigurationTest extends PlatformTestCase { File projectDir = result.getFirst(); ProjectManager projectManager = ProjectManager.getInstance(); - Project reloaded = projectManager.loadAndOpenProject(projectDir.getAbsolutePath()); + Project reloaded = projectManager.loadAndOpenProject(projectDir); disposeOnTearDown(reloaded); ModuleManager moduleManager = ModuleManager.getInstance(reloaded); Module module = assertOneElement(moduleManager.getModules()); moduleManager.disposeModule(module); closeProject(reloaded, true); - reloaded = projectManager.loadAndOpenProject(projectDir.getAbsolutePath()); + reloaded = projectManager.loadAndOpenProject(projectDir); disposeOnTearDown(reloaded); assertEmpty(ModuleManager.getInstance(reloaded).getModules()); closeProject(reloaded, false); @@ -51,7 +51,7 @@ public class ModulesConfigurationTest extends PlatformTestCase { List errors = new ArrayList<>(); ProjectLoadingErrorsHeadlessNotifier.setErrorHandler(errors::add, getTestRootDisposable()); ProjectManager projectManager = ProjectManager.getInstance(); - Project reloaded = projectManager.loadAndOpenProject(projectDir.getAbsolutePath()); + Project reloaded = projectManager.loadAndOpenProject(projectDir); disposeOnTearDown(reloaded); ModuleManager moduleManager = ModuleManager.getInstance(reloaded); assertThat(moduleManager.getModules()).hasSize(1); @@ -59,7 +59,7 @@ public class ModulesConfigurationTest extends PlatformTestCase { closeProject(reloaded, true); errors.clear(); - reloaded = projectManager.loadAndOpenProject(projectDir.getAbsolutePath()); + reloaded = projectManager.loadAndOpenProject(projectDir); disposeOnTearDown(reloaded); assertEmpty(errors); closeProject(reloaded, false); diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/JBNavigateCommandTest.kt b/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/JBNavigateCommandTest.kt index 4ca8abca95da..36c9747da06a 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/JBNavigateCommandTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/JBNavigateCommandTest.kt @@ -169,7 +169,7 @@ class JBNavigateCommandTest : PlatformTestCase() { var project: Project? = manager.createProject("navigateToProject", path.path) project!!.save() PlatformTestUtil.forceCloseProjectWithoutSaving(project) - project = manager.loadAndOpenProject(path.path) + project = manager.loadAndOpenProject(path) return project!! } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/ProjectOpeningTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/ProjectOpeningTest.java index ab88ee2c28c6..578c97b3f086 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/ProjectOpeningTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/ProjectOpeningTest.java @@ -61,7 +61,7 @@ public class ProjectOpeningTest extends PlatformTestCase { } }); - project = manager.loadAndOpenProject(foo.getPath()); + project = manager.loadAndOpenProject(foo); assertFalse(project.isOpen()); assertTrue(project.isDisposed()); } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/RecentProjectsTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/RecentProjectsTest.java index 48a4e4e6862f..163bcf0e2367 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/RecentProjectsTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/project/impl/RecentProjectsTest.java @@ -69,7 +69,7 @@ public class RecentProjectsTest extends PlatformTestCase { ProjectManagerEx manager = ProjectManagerEx.getInstanceEx(); project = manager.createProject(null, path.getPath()); closeProject(project); - project = manager.loadAndOpenProject(path.getPath()); + project = manager.loadAndOpenProject(path); long timestamp = getProjectOpenTimestamp("z1"); RecentProjectsManagerBase.getInstanceEx().updateLastProjectPath(); // "Timestamp for opened project has not been updated" @@ -129,7 +129,7 @@ public class RecentProjectsTest extends PlatformTestCase { project = manager.createProject(null, path.getPath()); project.save(); closeProject(project); - project = manager.loadAndOpenProject(path.getPath()); + project = manager.loadAndOpenProject(path); return project.getBasePath(); } finally { diff --git a/platform/projectModel-api/src/com/intellij/openapi/project/ProjectManager.java b/platform/projectModel-api/src/com/intellij/openapi/project/ProjectManager.java index 163d2d290126..c4e40e66af38 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/project/ProjectManager.java +++ b/platform/projectModel-api/src/com/intellij/openapi/project/ProjectManager.java @@ -3,12 +3,15 @@ package com.intellij.openapi.project; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.messages.Topic; import org.jdom.JDOMException; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; +import java.io.File; import java.io.IOException; /** @@ -91,10 +94,16 @@ public abstract class ProjectManager { * or because the project is already open. * @throws IOException if the project file was not found or failed to read * @throws JDOMException if the project file contained invalid XML - * @throws InvalidDataException if the project file contained invalid data */ @Nullable - public abstract Project loadAndOpenProject(@NotNull String filePath) throws IOException, JDOMException, InvalidDataException; + public abstract Project loadAndOpenProject(@NotNull String filePath) throws IOException, JDOMException; + + @ApiStatus.Experimental + public abstract Project loadAndOpenProject(@NotNull VirtualFile file) throws IOException, JDOMException; + + @ApiStatus.Experimental + @TestOnly + public abstract Project loadAndOpenProject(@NotNull File file) throws IOException, JDOMException; /** * Closes the specified project, but does not dispose it.