From dc9dc72f7ad45fd4c3f36f77baf799b8ab437c2c Mon Sep 17 00:00:00 2001
From: Sebastian Schuberth <sebastian.schuberth@bosch.io>
Date: Mon, 9 May 2022 18:20:54 +0200
Subject: [PATCH] ProcessCapture: Make `{stdout,stderr}File` private

The fact that `ProcessCapture` uses temporary files to work around the
64k buffering limit is an implementation detail that should not be
exposed to ease switching to another process builder alternative
eventually. Also see [1].

[1]: https://github.com/oss-review-toolkit/ort/issues/4668

Signed-off-by: Sebastian Schuberth <sebastian.schuberth@bosch.io>
---
 analyzer/src/main/kotlin/managers/Npm.kt       |  2 +-
 analyzer/src/main/kotlin/managers/Pipenv.kt    |  6 ++----
 analyzer/src/main/kotlin/managers/Yarn.kt      |  2 +-
 scanner/src/main/kotlin/scanners/Askalono.kt   |  6 +++---
 scanner/src/main/kotlin/scanners/Licensee.kt   | 10 +++++-----
 utils/common/src/main/kotlin/ProcessCapture.kt |  4 ++--
 6 files changed, 14 insertions(+), 16 deletions(-)

diff --git a/analyzer/src/main/kotlin/managers/Npm.kt b/analyzer/src/main/kotlin/managers/Npm.kt
index a1ab57567181e..409762b2d2be8 100644
--- a/analyzer/src/main/kotlin/managers/Npm.kt
+++ b/analyzer/src/main/kotlin/managers/Npm.kt
@@ -425,7 +425,7 @@ open class Npm(
 
     protected open fun getRemotePackageDetails(workingDir: File, packageName: String): JsonNode {
         val process = run(workingDir, "view", "--json", packageName)
-        return jsonMapper.readTree(process.stdoutFile)
+        return jsonMapper.readTree(process.stdout)
     }
 
     /**
diff --git a/analyzer/src/main/kotlin/managers/Pipenv.kt b/analyzer/src/main/kotlin/managers/Pipenv.kt
index ef2abbe403dc6..03a8d1646cc8c 100644
--- a/analyzer/src/main/kotlin/managers/Pipenv.kt
+++ b/analyzer/src/main/kotlin/managers/Pipenv.kt
@@ -69,10 +69,8 @@ class Pipenv(
 
         log.info { "Generating '${requirementsFile.name}' file in '$workingDir' directory..." }
 
-        ProcessCapture(workingDir, command(), "lock", "--requirements")
-            .requireSuccess()
-            .stdoutFile
-            .copyTo(requirementsFile)
+        val requirements = ProcessCapture(workingDir, command(), "lock", "--requirements").requireSuccess().stdout
+        requirementsFile.writeText(requirements)
 
         return Pip(managerName, analysisRoot, analyzerConfig, repoConfig)
             .resolveDependencies(requirementsFile, labels)
diff --git a/analyzer/src/main/kotlin/managers/Yarn.kt b/analyzer/src/main/kotlin/managers/Yarn.kt
index df6550c1be020..94136bc7f1b90 100644
--- a/analyzer/src/main/kotlin/managers/Yarn.kt
+++ b/analyzer/src/main/kotlin/managers/Yarn.kt
@@ -69,6 +69,6 @@ class Yarn(
 
     override fun getRemotePackageDetails(workingDir: File, packageName: String): JsonNode {
         val process = run(workingDir, "info", "--json", packageName)
-        return jsonMapper.readTree(process.stdoutFile)["data"]
+        return jsonMapper.readTree(process.stdout)["data"]
     }
 }
diff --git a/scanner/src/main/kotlin/scanners/Askalono.kt b/scanner/src/main/kotlin/scanners/Askalono.kt
index 11df660835e3e..5b9faaf7a0d62 100644
--- a/scanner/src/main/kotlin/scanners/Askalono.kt
+++ b/scanner/src/main/kotlin/scanners/Askalono.kt
@@ -114,14 +114,14 @@ class Askalono internal constructor(
             if (stderr.isNotBlank()) log.debug { stderr }
             if (isError) throw ScanException(errorMessage)
 
-            generateSummary(startTime, endTime, path, stdoutFile)
+            generateSummary(startTime, endTime, path, stdout)
         }
     }
 
-    private fun generateSummary(startTime: Instant, endTime: Instant, scanPath: File, resultFile: File): ScanSummary {
+    private fun generateSummary(startTime: Instant, endTime: Instant, scanPath: File, result: String): ScanSummary {
         val licenseFindings = sortedSetOf<LicenseFinding>()
 
-        resultFile.readLines().forEach { line ->
+        result.lines().forEach { line ->
             val root = jsonMapper.readTree(line)
             root["result"]?.let { result ->
                 val licenseFinding = LicenseFinding(
diff --git a/scanner/src/main/kotlin/scanners/Licensee.kt b/scanner/src/main/kotlin/scanners/Licensee.kt
index 78cc6065f6310..f4ae0b518d2f0 100644
--- a/scanner/src/main/kotlin/scanners/Licensee.kt
+++ b/scanner/src/main/kotlin/scanners/Licensee.kt
@@ -28,7 +28,7 @@ import org.ossreviewtoolkit.model.ScanSummary
 import org.ossreviewtoolkit.model.TextLocation
 import org.ossreviewtoolkit.model.config.DownloaderConfiguration
 import org.ossreviewtoolkit.model.config.ScannerConfiguration
-import org.ossreviewtoolkit.model.readJsonFile
+import org.ossreviewtoolkit.model.jsonMapper
 import org.ossreviewtoolkit.scanner.AbstractScannerFactory
 import org.ossreviewtoolkit.scanner.BuildConfig
 import org.ossreviewtoolkit.scanner.CommandLineScanner
@@ -97,15 +97,15 @@ class Licensee internal constructor(
             if (stderr.isNotBlank()) log.debug { stderr }
             if (isError) throw ScanException(errorMessage)
 
-            generateSummary(startTime, endTime, path, stdoutFile)
+            generateSummary(startTime, endTime, path, stdout)
         }
     }
 
-    private fun generateSummary(startTime: Instant, endTime: Instant, scanPath: File, resultFile: File): ScanSummary {
+    private fun generateSummary(startTime: Instant, endTime: Instant, scanPath: File, result: String): ScanSummary {
         val licenseFindings = sortedSetOf<LicenseFinding>()
 
-        val result = readJsonFile(resultFile)
-        val matchedFiles = result["matched_files"]
+        val json = jsonMapper.readTree(result)
+        val matchedFiles = json["matched_files"]
 
         matchedFiles.mapTo(licenseFindings) {
             val filePath = File(it["filename"].textValue())
diff --git a/utils/common/src/main/kotlin/ProcessCapture.kt b/utils/common/src/main/kotlin/ProcessCapture.kt
index 88247eff56458..3dcaef7de58a5 100644
--- a/utils/common/src/main/kotlin/ProcessCapture.kt
+++ b/utils/common/src/main/kotlin/ProcessCapture.kt
@@ -61,8 +61,8 @@ class ProcessCapture(vararg command: String, workingDir: File? = null, environme
     private val tempDir = createTempDirectory("$command-process").toFile().apply { deleteOnExit() }
     private val tempPrefix = command.first().substringAfterLast(File.separatorChar)
 
-    val stdoutFile = tempDir.resolve("$tempPrefix.stdout").apply { deleteOnExit() }
-    val stderrFile = tempDir.resolve("$tempPrefix.stderr").apply { deleteOnExit() }
+    private val stdoutFile = tempDir.resolve("$tempPrefix.stdout").apply { deleteOnExit() }
+    private val stderrFile = tempDir.resolve("$tempPrefix.stderr").apply { deleteOnExit() }
 
     /**
      * Get the standard output stream of the terminated process as a string.