From 1131e869ebde46ae99c3f45686d9fc465ea7e502 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 28 Apr 2017 18:22:28 +0200 Subject: [PATCH] =?UTF-8?q?ExternalStorage=20=E2=80=94=20request=20reimpor?= =?UTF-8?q?t=20if=20data=20format=20changed=20or=20data=20corrupted?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExternalSystemStreamProviderFactory.kt | 40 ++++++++++++++----- .../manage/ExternalProjectsDataStorage.java | 30 ++++++++------ 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/configurationStore/ExternalSystemStreamProviderFactory.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/configurationStore/ExternalSystemStreamProviderFactory.kt index 815c4b8ff6a8..f71dcba9ffbb 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/configurationStore/ExternalSystemStreamProviderFactory.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/configurationStore/ExternalSystemStreamProviderFactory.kt @@ -23,18 +23,20 @@ import com.intellij.openapi.components.* import com.intellij.openapi.diagnostic.catchAndLog import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsDataStorage +import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManagerImpl import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.project.ex.ProjectEx import com.intellij.openapi.roots.ExternalProjectSystemRegistry import com.intellij.openapi.roots.ProjectModelElement +import com.intellij.openapi.startup.StartupManager import com.intellij.openapi.util.Disposer -import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.registry.Registry -import com.intellij.util.io.DataExternalizer -import com.intellij.util.io.EnumeratorStringDescriptor -import com.intellij.util.io.PersistentHashMap -import java.io.* +import com.intellij.util.io.* +import java.io.DataInput +import java.io.DataOutput +import java.io.IOException +import java.io.InputStream import java.util.* private val EXTERNAL_STORAGE_ANNOTATION = FileStorageAnnotation(StoragePathMacros.MODULE_FILE, false, ExternalProjectStorage::class.java) @@ -93,10 +95,14 @@ internal class ExternalSystemStreamProviderFactory(private val project: Project) } } -private fun createStorage(project: Project): PersistentHashMap { - val file = File(ExternalProjectsDataStorage.getProjectConfigurationDir(), "${project.locationHash}/modules") +private val MODULE_FILE_FORMAT_VERSION = 0 - fun createMap() = PersistentHashMap(file, EnumeratorStringDescriptor.INSTANCE, object : DataExternalizer { +private fun createStorage(project: Project): PersistentHashMap { + val dir = ExternalProjectsDataStorage.getProjectConfigurationDir(project) + val versionFile = dir.resolve("modules.version") + val file = dir.resolve("modules") + + fun createMap() = PersistentHashMap(file.toFile(), EnumeratorStringDescriptor.INSTANCE, object : DataExternalizer { override fun read(`in`: DataInput): ByteArray { val available = (`in` as InputStream).available() val result = ByteArray(available) @@ -109,13 +115,27 @@ private fun createStorage(project: Project): PersistentHashMap externalProjects) throws IOException { - final File projectConfigurationFile = getProjectConfigurationFile(project); - if (!FileUtil.createParentDirs(projectConfigurationFile)) { + final Path projectConfigurationFile = getProjectConfigurationFile(project); + if (!FileUtil.createParentDirs(projectConfigurationFile.toFile())) { throw new IOException("Unable to save " + projectConfigurationFile); } @@ -343,7 +346,7 @@ public class ExternalProjectsDataStorage implements SettingsSavingComponent, Per }); } - DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(projectConfigurationFile))); + DataOutputStream out = new DataOutputStream(new BufferedOutputStream(Files.newOutputStream(projectConfigurationFile))); try { out.writeUTF(STORAGE_VERSION); out.writeInt(externalProjects.size()); @@ -378,10 +381,10 @@ public class ExternalProjectsDataStorage implements SettingsSavingComponent, Per @NotNull private static Collection load(@NotNull Project project) throws IOException { SmartList projects = new SmartList<>(); - @SuppressWarnings("unchecked") final File configurationFile = getProjectConfigurationFile(project); - if (!configurationFile.isFile()) return projects; + @SuppressWarnings("unchecked") final Path configurationFile = getProjectConfigurationFile(project); + if (!Files.isRegularFile(configurationFile)) return projects; - DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(configurationFile))); + DataInputStream in = new DataInputStream(new BufferedInputStream(Files.newInputStream(configurationFile))); try { final String storage_version = in.readUTF(); @@ -409,16 +412,19 @@ public class ExternalProjectsDataStorage implements SettingsSavingComponent, Per return projects; } - private static File getProjectConfigurationFile(@NotNull Project project) { - return new File(getProjectConfigurationDir(), project.getLocationHash() + "/project.dat"); + @NotNull + private static Path getProjectConfigurationFile(@NotNull Project project) { + return getProjectConfigurationDir(project).resolve("project.dat"); } - public static File getProjectConfigurationDir() { - return getExternalBuildSystemDir("Projects"); + @NotNull + public static Path getProjectConfigurationDir(@NotNull Project project) { + return getExternalBuildSystemDir("Projects").resolve(project.getLocationHash()); } - private static File getExternalBuildSystemDir(String folder) { - return new File(PathManager.getSystemPath(), "external_build_system" + "/" + folder).getAbsoluteFile(); + @NotNull + private static Path getExternalBuildSystemDir(String folder) { + return Paths.get(PathManager.getSystemPath(), "external_build_system", folder).toAbsolutePath(); } @Nullable