From 090b562db7ba353e34dbe08438db08bda7d443f3 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Mon, 16 Nov 2020 20:21:32 +0300 Subject: [PATCH] Use NIO Files for creating temp files: scripting, daemon, main-kts --- .../experimental/KotlinCompilerClient.kt | 3 ++- .../daemon/client/KotlinCompilerClient.kt | 3 ++- .../kotlin/daemon/common/ClientUtils.kt | 8 ++++++- libraries/scripting/jvm/build.gradle.kts | 6 ++++++ .../experimental/jvm/util/jvmClasspathUtil.kt | 21 +++++++++++++++---- .../org/jetbrains/kotlin/mainKts/impl/ivy.kt | 3 ++- 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/compiler/daemon/daemon-client-new/src/org/jetbrains/kotlin/daemon/client/experimental/KotlinCompilerClient.kt b/compiler/daemon/daemon-client-new/src/org/jetbrains/kotlin/daemon/client/experimental/KotlinCompilerClient.kt index 5d2ce0bc463..16e26d29b41 100644 --- a/compiler/daemon/daemon-client-new/src/org/jetbrains/kotlin/daemon/client/experimental/KotlinCompilerClient.kt +++ b/compiler/daemon/daemon-client-new/src/org/jetbrains/kotlin/daemon/client/experimental/KotlinCompilerClient.kt @@ -25,6 +25,7 @@ import java.io.File import java.io.Serializable import java.net.SocketException import java.nio.channels.ClosedChannelException +import java.nio.file.Files import java.rmi.ConnectException import java.rmi.ConnectIOException import java.rmi.UnmarshalException @@ -422,7 +423,7 @@ class KotlinCompilerClient : KotlinCompilerDaemonClient { report: (DaemonReportCategory, String) -> Unit ): Deferred> = GlobalScope.async { registryDir.mkdirs() - val timestampMarker = createTempFile("kotlin-daemon-client-tsmarker", directory = registryDir) + val timestampMarker = Files.createTempFile(registryDir.toPath(), "kotlin-daemon-client-tsmarker", null).toFile() val aliveWithMetadata = try { walkDaemonsAsync(registryDir, compilerId, timestampMarker, report = report) } finally { diff --git a/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/KotlinCompilerClient.kt b/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/KotlinCompilerClient.kt index d05d67ca80c..38d45247c73 100644 --- a/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/KotlinCompilerClient.kt +++ b/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/KotlinCompilerClient.kt @@ -26,6 +26,7 @@ import java.io.File import java.io.OutputStream import java.io.PrintStream import java.net.SocketException +import java.nio.file.Files import java.rmi.ConnectException import java.rmi.ConnectIOException import java.rmi.UnmarshalException @@ -347,7 +348,7 @@ object KotlinCompilerClient { private fun tryFindSuitableDaemonOrNewOpts(registryDir: File, compilerId: CompilerId, daemonJVMOptions: DaemonJVMOptions, report: (DaemonReportCategory, String) -> Unit): Pair { registryDir.mkdirs() - val timestampMarker = createTempFile("kotlin-daemon-client-tsmarker", directory = registryDir) + val timestampMarker = Files.createTempFile(registryDir.toPath(), "kotlin-daemon-client-tsmarker", null).toFile() val aliveWithMetadata = try { walkDaemons(registryDir, compilerId, timestampMarker, report = report).toList() } diff --git a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/ClientUtils.kt b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/ClientUtils.kt index 8bf0712a9d5..d5dc62c89b1 100644 --- a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/ClientUtils.kt +++ b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/ClientUtils.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.daemon.common import java.io.File +import java.nio.file.Files import java.rmi.registry.LocateRegistry @@ -106,7 +107,12 @@ private inline fun tryConnectToDaemon(port: Int, report: (DaemonReportCategory, private const val validFlagFileKeywordChars = "abcdefghijklmnopqrstuvwxyz0123456789-_" fun makeAutodeletingFlagFile(keyword: String = "compiler-client", baseDir: File? = null): File { - val flagFile = File.createTempFile("kotlin-${keyword.filter { validFlagFileKeywordChars.contains(it.toLowerCase()) }}-", "-is-running", baseDir?.takeIf { it.isDirectory && it.exists() }) + val prefix = "kotlin-${keyword.filter { validFlagFileKeywordChars.contains(it.toLowerCase()) }}-" + val flagFile = if (baseDir?.isDirectory == true) + Files.createTempFile(baseDir.toPath(), prefix, "-is-running").toFile() + else + Files.createTempFile(prefix, "-is-running").toFile() + flagFile.deleteOnExit() return flagFile } diff --git a/libraries/scripting/jvm/build.gradle.kts b/libraries/scripting/jvm/build.gradle.kts index 69e883e00bf..1c4d0375587 100644 --- a/libraries/scripting/jvm/build.gradle.kts +++ b/libraries/scripting/jvm/build.gradle.kts @@ -4,7 +4,9 @@ plugins { id("jps-compatible") } +val JDK_16: String by project jvmTarget = "1.6" +javaHome = JDK_16 dependencies { compile(project(":kotlin-script-runtime")) @@ -22,6 +24,10 @@ tasks.withType> { kotlinOptions.freeCompilerArgs += "-Xallow-kotlin-package" } +tasks.withType { + executable = "$JDK_16/bin/java" +} + publish() runtimeJar() diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClasspathUtil.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClasspathUtil.kt index 9470beff944..9dfd226d341 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClasspathUtil.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/util/jvmClasspathUtil.kt @@ -59,9 +59,18 @@ class ClasspathExtractionException(message: String) : Exception(message) fun classpathFromClassloader(currentClassLoader: ClassLoader, unpackJarCollections: Boolean = false): List? { val processedJars = hashSetOf() val unpackJarCollectionsDir by lazy { - createTempDir("unpackedJarCollections").canonicalFile.also { + File.createTempFile("unpackedJarCollections", null).canonicalFile.apply { + delete() + mkdir() + setReadable(false, false) + setWritable(false, false) + setExecutable(false, false) + setReadable(true, true) + setWritable(true, true) + setExecutable(true, true) + Runtime.getRuntime().addShutdownHook(Thread { - it.deleteRecursively() + deleteRecursively() }) } } @@ -144,8 +153,12 @@ fun ClassLoader.classPathFromTypicalResourceUrls(): Sequence = .distinct() .filter { it.isValidClasspathFile() } -private fun File.unpackJarCollection(rootTempDir: File?): Sequence { - val targetDir = createTempDir(nameWithoutExtension, directory = rootTempDir) +private fun File.unpackJarCollection(rootTempDir: File): Sequence { + val targetDir = File.createTempFile(nameWithoutExtension, null, rootTempDir).apply { + delete() + mkdir() + } + return try { ArrayList().apply { JarInputStream(FileInputStream(this@unpackJarCollection)).use { jarInputStream -> diff --git a/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/impl/ivy.kt b/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/impl/ivy.kt index d145470a658..db4a8d3f800 100644 --- a/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/impl/ivy.kt +++ b/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/impl/ivy.kt @@ -19,6 +19,7 @@ import org.apache.ivy.plugins.resolver.IBiblioResolver import org.apache.ivy.util.DefaultMessageLogger import org.apache.ivy.util.Message import java.io.File +import java.nio.file.Files import kotlin.script.experimental.api.* import kotlin.script.experimental.dependencies.ExternalDependenciesResolver import kotlin.script.experimental.dependencies.RepositoryCoordinates @@ -134,7 +135,7 @@ class IvyResolver : ExternalDependenciesResolver { // val report = ivy.resolve(moduleDescriptor, resolveOptions) //creates an ivy configuration file - val ivyFile = createTempFile("ivy", ".xml").apply { deleteOnExit() } + val ivyFile = Files.createTempFile("ivy", ".xml").toFile().apply { deleteOnExit() } XmlModuleDescriptorWriter.write(moduleDescriptor, ivyFile) val report = ivy.resolve(ivyFile.toURI().toURL(), resolveOptions)