mirror of
https://codeberg.org/PGPainless/sop-java.git
synced 2024-12-22 12:57:57 +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