You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
provs/src/main/kotlin/io/provs/processors/LocalProcessor.kt

78 lines
2.1 KiB
Kotlin

package io.provs.processors
import io.provs.escapeNewline
import org.slf4j.LoggerFactory
import java.io.File
import java.io.IOException
import java.nio.charset.Charset
private fun getOsName(): String {
return System.getProperty("os.name")
}
open class LocalProcessor : Processor {
companion object {
@Suppress("JAVA_CLASS_ON_COMPANION")
private val log = LoggerFactory.getLogger(javaClass.enclosingClass)
var charset = if (getOsName().contains("Windows")) Charset.forName("Windows-1252") else Charset.defaultCharset()
init {
log.info("os.name: " + getOsName())
log.info("user.home: " + System.getProperty("user.home"))
}
}
private fun workingDir() : String
{
return System.getProperty("user.home") ?: File.separator
}
override fun x(vararg args: String): ProcessResult {
return execute(true, *args)
}
override fun xNoLog(vararg args: String): ProcessResult {
return execute(false, *args)
}
private fun execute(logging: Boolean, vararg args: String): ProcessResult {
try {
var prefix = "******************** Prov: "
if (logging) {
for (arg in args) {
prefix += " \"${arg.escapeNewline()}\""
}
} else {
prefix += "\"xxxxxxxx\""
}
log.info(prefix)
val proc = ProcessBuilder(args.toList())
.directory(File(workingDir()))
.redirectOutput(ProcessBuilder.Redirect.PIPE)
.redirectError(ProcessBuilder.Redirect.PIPE)
.start()
val c = proc.waitFor()
val r = ProcessResult(
c,
proc.inputStream.bufferedReader(charset).readText(),
proc.errorStream.bufferedReader(charset).readText(),
args = args
)
if (logging) {
log.info(r.toString())
}
return r
} catch (e: IOException) {
e.printStackTrace()
return ProcessResult(-1, ex = e)
}
}
}