mirror of
https://codeberg.org/PGPainless/sop-java.git
synced 2024-12-22 04:57:56 +01:00
Kotlin conversion: VersionExternal
This commit is contained in:
parent
832a455c4c
commit
3eaae149b7
4 changed files with 98 additions and 179 deletions
|
@ -1,163 +0,0 @@
|
|||
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
|
||||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package sop.external.operation;
|
||||
|
||||
import sop.external.ExternalSOP;
|
||||
import sop.operation.Version;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Implementation of the {@link Version} operation using an external SOP binary.
|
||||
*/
|
||||
public class VersionExternal implements Version {
|
||||
|
||||
private final Runtime runtime = Runtime.getRuntime();
|
||||
private final String binary;
|
||||
private final Properties environment;
|
||||
|
||||
public VersionExternal(String binaryName, Properties environment) {
|
||||
this.binary = binaryName;
|
||||
this.environment = environment;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public String getName() {
|
||||
String[] command = new String[] {binary, "version"};
|
||||
String[] env = ExternalSOP.propertiesToEnv(environment).toArray(new String[0]);
|
||||
try {
|
||||
Process process = runtime.exec(command, env);
|
||||
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
|
||||
String line = stdInput.readLine().trim();
|
||||
ExternalSOP.finish(process);
|
||||
if (line.contains(" ")) {
|
||||
return line.substring(0, line.lastIndexOf(" "));
|
||||
}
|
||||
return line;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public String getVersion() {
|
||||
String[] command = new String[] {binary, "version"};
|
||||
String[] env = ExternalSOP.propertiesToEnv(environment).toArray(new String[0]);
|
||||
try {
|
||||
Process process = runtime.exec(command, env);
|
||||
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
|
||||
String line = stdInput.readLine().trim();
|
||||
ExternalSOP.finish(process);
|
||||
if (line.contains(" ")) {
|
||||
return line.substring(line.lastIndexOf(" ") + 1);
|
||||
}
|
||||
return line;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public String getBackendVersion() {
|
||||
String[] command = new String[] {binary, "version", "--backend"};
|
||||
String[] env = ExternalSOP.propertiesToEnv(environment).toArray(new String[0]);
|
||||
try {
|
||||
Process process = runtime.exec(command, env);
|
||||
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String line;
|
||||
while ((line = stdInput.readLine()) != null) {
|
||||
sb.append(line).append('\n');
|
||||
}
|
||||
ExternalSOP.finish(process);
|
||||
return sb.toString();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public String getExtendedVersion() {
|
||||
String[] command = new String[] {binary, "version", "--extended"};
|
||||
String[] env = ExternalSOP.propertiesToEnv(environment).toArray(new String[0]);
|
||||
try {
|
||||
Process process = runtime.exec(command, env);
|
||||
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String line;
|
||||
while ((line = stdInput.readLine()) != null) {
|
||||
sb.append(line).append('\n');
|
||||
}
|
||||
ExternalSOP.finish(process);
|
||||
return sb.toString();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSopSpecRevisionNumber() {
|
||||
String revision = getSopSpecVersion();
|
||||
String firstLine;
|
||||
if (revision.contains("\n")) {
|
||||
firstLine = revision.substring(0, revision.indexOf("\n"));
|
||||
} else {
|
||||
firstLine = revision;
|
||||
}
|
||||
|
||||
if (!firstLine.contains("-")) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return Integer.parseInt(firstLine.substring(firstLine.lastIndexOf("-") + 1));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSopSpecImplementationIncomplete() {
|
||||
String revision = getSopSpecVersion();
|
||||
return revision.startsWith("~");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSopSpecImplementationRemarks() {
|
||||
String revision = getSopSpecVersion();
|
||||
if (revision.contains("\n")) {
|
||||
String tail = revision.substring(revision.indexOf("\n") + 1).trim();
|
||||
|
||||
if (!tail.isEmpty()) {
|
||||
return tail;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nonnull
|
||||
public String getSopSpecVersion() {
|
||||
String[] command = new String[] {binary, "version", "--sop-spec"};
|
||||
String[] env = ExternalSOP.propertiesToEnv(environment).toArray(new String[0]);
|
||||
try {
|
||||
Process process = runtime.exec(command, env);
|
||||
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String line;
|
||||
while ((line = stdInput.readLine()) != null) {
|
||||
sb.append(line).append('\n');
|
||||
}
|
||||
ExternalSOP.finish(process);
|
||||
return sb.toString();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
|
||||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/**
|
||||
* Bindings for SOP subcommands to a SOP binary.
|
||||
*/
|
||||
package sop.external.operation;
|
|
@ -1,8 +0,0 @@
|
|||
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
|
||||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
/**
|
||||
* Implementation of sop-java which delegates execution to a binary implementing the SOP command line interface.
|
||||
*/
|
||||
package sop.external;
|
98
external-sop/src/main/kotlin/sop/external/operation/VersionExternal.kt
vendored
Normal file
98
external-sop/src/main/kotlin/sop/external/operation/VersionExternal.kt
vendored
Normal file
|
@ -0,0 +1,98 @@
|
|||
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
|
||||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package sop.external.operation
|
||||
|
||||
import java.io.IOException
|
||||
import java.util.Properties
|
||||
import sop.external.ExternalSOP
|
||||
import sop.operation.Version
|
||||
|
||||
/** Implementation of the [Version] operation using an external SOP binary. */
|
||||
class VersionExternal(binary: String, environment: Properties) : Version {
|
||||
|
||||
private val commandList = listOf(binary, "version")
|
||||
private val envList = ExternalSOP.propertiesToEnv(environment)
|
||||
|
||||
override fun getName(): String {
|
||||
val info = executeForLine(commandList)
|
||||
return if (info.contains(" ")) {
|
||||
info.substring(0, info.lastIndexOf(" "))
|
||||
} else {
|
||||
info
|
||||
}
|
||||
}
|
||||
|
||||
override fun getVersion(): String {
|
||||
val info = executeForLine(commandList)
|
||||
return if (info.contains(" ")) {
|
||||
info.substring(info.lastIndexOf(" ") + 1)
|
||||
} else {
|
||||
info
|
||||
}
|
||||
}
|
||||
|
||||
override fun getBackendVersion(): String {
|
||||
return executeForLines(commandList.plus("--backend"))
|
||||
}
|
||||
|
||||
override fun getExtendedVersion(): String {
|
||||
return executeForLines(commandList.plus("--extended"))
|
||||
}
|
||||
|
||||
override fun getSopSpecRevisionNumber(): Int {
|
||||
val revision = getSopSpecVersion()
|
||||
val firstLine =
|
||||
if (revision.contains("\n")) {
|
||||
revision.substring(0, revision.indexOf("\n"))
|
||||
} else {
|
||||
revision
|
||||
}
|
||||
|
||||
if (!firstLine.contains("-")) {
|
||||
return -1
|
||||
}
|
||||
return Integer.parseInt(firstLine.substring(firstLine.lastIndexOf("-") + 1))
|
||||
}
|
||||
|
||||
override fun isSopSpecImplementationIncomplete(): Boolean {
|
||||
return getSopSpecVersion().startsWith("~")
|
||||
}
|
||||
|
||||
override fun getSopSpecImplementationRemarks(): String? {
|
||||
val revision = getSopSpecVersion()
|
||||
if (revision.contains("\n")) {
|
||||
revision.substring(revision.indexOf("\n")).trim().takeIf { it.isNotBlank() }
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
override fun getSopSpecVersion(): String {
|
||||
return executeForLines(commandList.plus("--sop-spec"))
|
||||
}
|
||||
|
||||
private fun executeForLine(commandList: List<String>): String {
|
||||
return try {
|
||||
val process =
|
||||
Runtime.getRuntime().exec(commandList.toTypedArray(), envList.toTypedArray())
|
||||
val result = process.inputStream.bufferedReader().readLine()
|
||||
ExternalSOP.finish(process)
|
||||
result.trim()
|
||||
} catch (e: IOException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
}
|
||||
|
||||
private fun executeForLines(commandList: List<String>): String {
|
||||
return try {
|
||||
val process =
|
||||
Runtime.getRuntime().exec(commandList.toTypedArray(), envList.toTypedArray())
|
||||
val result = process.inputStream.bufferedReader().readLines().joinToString("\n")
|
||||
ExternalSOP.finish(process)
|
||||
result.trim()
|
||||
} catch (e: IOException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue