From c9d5bcb40c2799cf87960a7fa460cf2022bec998 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 13 Dec 2019 00:00:04 +0100 Subject: [PATCH] [platform] common code for reading project name Fixes NPE (in JPS( and weird names (like 'W') GitOrigin-RevId: 54837027fffe7c1bcc55067511af54d9ee6bc2cd --- .../org/jetbrains/jps/util/JpsPathUtil.java | 20 ++++++++++++++ .../model/serialization/JpsProjectLoader.java | 13 +++------ .../src/ProjectStoreImpl.kt | 27 ++++++++++--------- .../configurationStore/storageUtil.kt | 7 ----- .../intellij/ide/RecentProjectsManagerBase.kt | 23 ++++++---------- 5 files changed, 46 insertions(+), 44 deletions(-) diff --git a/jps/model-api/src/org/jetbrains/jps/util/JpsPathUtil.java b/jps/model-api/src/org/jetbrains/jps/util/JpsPathUtil.java index 12a68fea60ce..6affa19c6f1e 100644 --- a/jps/model-api/src/org/jetbrains/jps/util/JpsPathUtil.java +++ b/jps/model-api/src/org/jetbrains/jps/util/JpsPathUtil.java @@ -9,7 +9,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Set; +import java.util.stream.Stream; /** * @author nik @@ -84,4 +88,20 @@ public class JpsPathUtil { public static boolean isJrtUrl(@NotNull String url) { return url.startsWith("jrt://"); } + + public static @Nullable String readProjectName(@NotNull Path projectDir) { + try (Stream stream = Files.lines(projectDir.resolve(".name"))) { + return stream.findFirst().map(String::trim).orElse(null); + } + catch (IOException e) { + return null; + } + } + + public static final String UNNAMED_PROJECT = ""; + + public static @NotNull String getDefaultProjectName(@NotNull Path projectDir) { + Path parent = projectDir.getParent(); + return parent != null ? parent.getFileName().toString() : UNNAMED_PROJECT; + } } \ No newline at end of file diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java index 5175a93725f1..c8fa8eec6a40 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java @@ -33,6 +33,7 @@ import org.jetbrains.jps.model.serialization.module.JpsModulePropertiesSerialize import org.jetbrains.jps.model.serialization.module.JpsModuleRootModelSerializer; import org.jetbrains.jps.model.serialization.runConfigurations.JpsRunConfigurationSerializer; import org.jetbrains.jps.service.SharedThreadPool; +import org.jetbrains.jps.util.JpsPathUtil; import java.io.File; import java.io.IOException; @@ -43,7 +44,6 @@ import java.nio.file.Paths; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; -import java.util.stream.Stream; /** * @author nik @@ -101,15 +101,8 @@ public class JpsProjectLoader extends JpsLoaderBase { @NotNull public static String getDirectoryBaseProjectName(@NotNull Path dir) { - try (Stream stream = Files.lines(dir.resolve(".name"))) { - String value = stream.findFirst().map(String::trim).orElse(null); - if (value != null) { - return value; - } - } - catch (IOException ignored) { } - Path parent = dir.getParent(); - return (parent == null ? dir : parent).getFileName().toString(); + String name = JpsPathUtil.readProjectName(dir); + return name != null ? name : JpsPathUtil.getDefaultProjectName(dir); } @Nullable diff --git a/platform/configuration-store-impl/src/ProjectStoreImpl.kt b/platform/configuration-store-impl/src/ProjectStoreImpl.kt index 913bfd6d9b26..d163970b1817 100644 --- a/platform/configuration-store-impl/src/ProjectStoreImpl.kt +++ b/platform/configuration-store-impl/src/ProjectStoreImpl.kt @@ -19,12 +19,15 @@ import com.intellij.openapi.vfs.ReadonlyStatusHandler import com.intellij.openapi.vfs.VirtualFile import com.intellij.util.PathUtilRt import com.intellij.util.SmartList -import com.intellij.util.containers.computeIfAny -import com.intellij.util.io.* +import com.intellij.util.io.delete +import com.intellij.util.io.isDirectory +import com.intellij.util.io.systemIndependentPath +import com.intellij.util.io.write import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch import org.jetbrains.annotations.ApiStatus import org.jetbrains.annotations.CalledInAny +import org.jetbrains.jps.util.JpsPathUtil import java.nio.file.AccessDeniedException import java.nio.file.Path import java.nio.file.Paths @@ -53,18 +56,18 @@ open class ProjectStoreImpl(project: Project) : ProjectStoreBase(project) { return PathUtilRt.getFileName(projectFilePath).removeSuffix(ProjectFileType.DOT_DEFAULT_EXTENSION) } - val baseDir = projectBasePath - val nameFile = nameFile - if (nameFile.exists()) { - LOG.runAndLogException { readProjectNameFile(nameFile) }?.let { - lastSavedProjectName = it - return it - } + val projectDir = nameFile.parent + val storedName = JpsPathUtil.readProjectName(projectDir) + if (storedName != null) { + lastSavedProjectName = storedName + return storedName } - return ProjectNameProvider.EP_NAME.extensionList.computeIfAny { - LOG.runAndLogException { it.getDefaultName(project) } - } ?: PathUtilRt.getFileName(baseDir).replace(":", "") + val computedName = ProjectNameProvider.EP_NAME.iterable.asSequence() + .map { LOG.runAndLogException { it.getDefaultName(project) } } + .find { it != null } + + return computedName ?: JpsPathUtil.getDefaultProjectName(projectDir) } private suspend fun saveProjectName() { diff --git a/platform/platform-impl/src/com/intellij/configurationStore/storageUtil.kt b/platform/platform-impl/src/com/intellij/configurationStore/storageUtil.kt index c03e5d7cbadf..cbe55e12cf60 100644 --- a/platform/platform-impl/src/com/intellij/configurationStore/storageUtil.kt +++ b/platform/platform-impl/src/com/intellij/configurationStore/storageUtil.kt @@ -20,7 +20,6 @@ import com.intellij.openapi.ui.Messages import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VirtualFile import com.intellij.util.io.createDirectories -import com.intellij.util.io.inputStream import com.intellij.util.io.systemIndependentPath import gnu.trove.THashSet import org.jetbrains.annotations.ApiStatus @@ -149,10 +148,4 @@ inline fun runAsWriteActionIfNeeded(crossinline runnable: () -> T): T { ApplicationManager.getApplication().isWriteAccessAllowed -> runnable() else -> runWriteAction(runnable) } -} - -@Throws(IOException::class) -@ApiStatus.Internal -fun readProjectNameFile(nameFile: Path): String? { - return nameFile.inputStream().reader().useLines { line -> line.firstOrNull { !it.isEmpty() }?.trim() } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/RecentProjectsManagerBase.kt b/platform/platform-impl/src/com/intellij/ide/RecentProjectsManagerBase.kt index d0cfdfc9b0b8..98e97cd2d7dd 100644 --- a/platform/platform-impl/src/com/intellij/ide/RecentProjectsManagerBase.kt +++ b/platform/platform-impl/src/com/intellij/ide/RecentProjectsManagerBase.kt @@ -1,7 +1,6 @@ // 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.ide -import com.intellij.configurationStore.readProjectNameFile import com.intellij.ide.impl.OpenProjectTask import com.intellij.ide.impl.ProjectUtil import com.intellij.ide.ui.UISettings @@ -19,7 +18,6 @@ import com.intellij.openapi.diagnostic.runAndLogException import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectManager import com.intellij.openapi.project.ProjectManagerListener -import com.intellij.openapi.project.impl.ProjectImpl import com.intellij.openapi.util.ModificationTracker import com.intellij.openapi.util.SystemInfo import com.intellij.openapi.util.io.FileUtilRt @@ -42,10 +40,13 @@ import com.intellij.util.ui.UIUtil import gnu.trove.THashMap import gnu.trove.THashSet import org.jetbrains.annotations.ApiStatus.Internal +import org.jetbrains.jps.util.JpsPathUtil import java.awt.image.BufferedImage -import java.io.IOException import java.nio.ByteBuffer -import java.nio.file.* +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import java.nio.file.StandardCopyOption import java.util.* import java.util.concurrent.atomic.AtomicLong import javax.imageio.IIOImage @@ -573,17 +574,9 @@ private fun readProjectName(path: String): String { return FileUtilRt.getNameWithoutExtension(file.fileName.toString()) } - val nameFile = file.resolve(Project.DIRECTORY_STORE_FOLDER).resolve(ProjectImpl.NAME_FILE) - try { - val result = readProjectNameFile(nameFile) - if (result != null) { - return result - } - } - catch (ignore: NoSuchFileException) { } - catch (ignored: IOException) { } - - return file.fileName?.toString() ?: "" + val projectDir = file.resolve(Project.DIRECTORY_STORE_FOLDER) + return JpsPathUtil.readProjectName(projectDir) ?: + JpsPathUtil.getDefaultProjectName(projectDir) } private fun getLastProjectFrameInfoFile() = appSystemDir.resolve("lastProjectFrameInfo") \ No newline at end of file