diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFiles.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFiles.kt index 9dad5b6af53..986782591a7 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFiles.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFiles.kt @@ -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) } } diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFilesTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFilesTest.kt index 5f8d6e9054f..e4a817ed3d1 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFilesTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/LastModifiedFilesTest.kt @@ -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()) + } } \ No newline at end of file