Load file attributes for last modified files under try-catch

This should avoid exceptions from initialization of GradleBuildRootsManager.EP

EA-232521 Fixed
This commit is contained in:
Natalia Selezneva
2020-07-06 15:52:43 +03:00
parent 03bc61c80a
commit 6c0d91837c
2 changed files with 63 additions and 9 deletions
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.idea.core.util.writeNullable
import org.jetbrains.kotlin.idea.core.util.writeStringList
import java.io.DataInputStream
import java.io.DataOutput
import java.io.DataOutputStream
/**
* Optimized collection for storing last modified files with ability to
@@ -62,19 +63,38 @@ class LastModifiedFiles(
private val fileAttribute = FileAttribute("last-modified-files", 1, false)
fun read(buildRoot: VirtualFile): LastModifiedFiles? {
return fileAttribute.readAttribute(buildRoot)?.use {
it.readNullable {
LastModifiedFiles(readSCF(it), readSCF(it))
try {
return fileAttribute.readAttribute(buildRoot)?.use {
readLastModifiedFiles(it)
}
} catch (e: Exception) {
scriptingErrorLog("Cannot read data for buildRoot=$buildRoot from file attributes", e)
return null
}
}
internal fun readLastModifiedFiles(it: DataInputStream) = it.readNullable {
LastModifiedFiles(readSCF(it), readSCF(it))
}
fun write(buildRoot: VirtualFile, data: LastModifiedFiles?) {
try {
fileAttribute.writeAttribute(buildRoot).use {
writeLastModifiedFiles(it, data)
}
} catch (e: Exception) {
scriptingErrorLog("Cannot store data=$data for buildRoot=$buildRoot to file attributes", e)
fileAttribute.writeAttribute(buildRoot).use {
writeLastModifiedFiles(it, null)
}
}
}
fun write(buildRoot: VirtualFile, data: LastModifiedFiles?) {
fileAttribute.writeAttribute(buildRoot).use {
it.writeNullable(data) { data ->
writeSCF(data.last)
writeSCF(data.previous)
}
internal fun writeLastModifiedFiles(it: DataOutputStream, data: LastModifiedFiles?) {
it.writeNullable(data) { data ->
writeSCF(data.last)
writeSCF(data.previous)
}
}
@@ -6,6 +6,10 @@
package org.jetbrains.kotlin.idea.scripting.gradle
import org.junit.Test
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.DataInputStream
import java.io.DataOutputStream
import kotlin.test.assertEquals
class LastModifiedFilesTest {
@@ -149,4 +153,34 @@ class LastModifiedFilesTest {
assertEquals(2, restored.lastModifiedTimeStampExcept("x"))
assertEquals(2, restored.lastModifiedTimeStampExcept("y"))
}
@Test
fun testFileAttributes() {
val expected = LastModifiedFiles(
LastModifiedFiles.SimultaneouslyChangedFiles(System.currentTimeMillis(), mutableSetOf("C:file/sldkfjlsdkjf")),
LastModifiedFiles.SimultaneouslyChangedFiles(System.currentTimeMillis(), mutableSetOf("C:/file/foo/d/"))
)
checkFileAttributesSave(expected)
}
@Test
fun testFileAttributesNullable() {
val expected: LastModifiedFiles? = null
checkFileAttributesSave(expected)
}
@Test
fun testDefaultFileAttributes() {
val expected = LastModifiedFiles()
checkFileAttributesSave(expected)
}
private fun checkFileAttributesSave(expected: LastModifiedFiles?) {
val buffer = ByteArrayOutputStream()
LastModifiedFiles.writeLastModifiedFiles(DataOutputStream(buffer), expected)
val actual = LastModifiedFiles.readLastModifiedFiles(DataInputStream(ByteArrayInputStream(buffer.toByteArray())))
assertEquals(expected.toString(), actual.toString())
}
}