From 560efbd345067e8199fb7aa09f870cc13516f336 Mon Sep 17 00:00:00 2001 From: Christopher Schnick Date: Sun, 25 Dec 2022 10:19:18 +0100 Subject: [PATCH] Various small fixes for beacon exchanges --- .../io/xpipe/beacon/BeaconConnection.java | 16 +++++++++++++- .../exchange/cli/RemoveStoreExchange.java | 2 -- .../cli/StoreProviderListExchange.java | 3 ++- .../exchange/cli/WriteExecuteExchange.java | 6 ++++- .../cli/WritePreparationExchange.java | 7 +++--- .../java/io/xpipe/core/impl/FileNames.java | 12 ++++++++++ .../java/io/xpipe/core/impl/FileStore.java | 3 +++ .../java/io/xpipe/core/source/WriteMode.java | 22 +++++++++++-------- .../io/xpipe/extension/event/TrackEvent.java | 7 +++--- 9 files changed, 57 insertions(+), 21 deletions(-) diff --git a/beacon/src/main/java/io/xpipe/beacon/BeaconConnection.java b/beacon/src/main/java/io/xpipe/beacon/BeaconConnection.java index 99cfa6e0..c1672908 100644 --- a/beacon/src/main/java/io/xpipe/beacon/BeaconConnection.java +++ b/beacon/src/main/java/io/xpipe/beacon/BeaconConnection.java @@ -1,5 +1,6 @@ package io.xpipe.beacon; +import io.xpipe.beacon.exchange.WriteStreamExchange; import io.xpipe.beacon.exchange.cli.StoreAddExchange; import io.xpipe.beacon.util.QuietDialogHandler; import io.xpipe.core.impl.InternalStreamStore; @@ -174,13 +175,26 @@ public abstract class BeaconConnection implements AutoCloseable { } public InternalStreamStore createInternalStreamStore() { + return createInternalStreamStore(null); + } + + public InternalStreamStore createInternalStreamStore(String name) { var store = new InternalStreamStore(); - var addReq = StoreAddExchange.Request.builder().storeInput(store).name(store.getUuid().toString()).build(); + var addReq = StoreAddExchange.Request.builder().storeInput(store).name(name != null ? name : store.getUuid().toString()).build(); StoreAddExchange.Response addRes = performSimpleExchange(addReq); QuietDialogHandler.handle(addRes.getConfig(), this); return store; } + public void writeStream(InternalStreamStore s, InputStream in) { + writeStream(s.getUuid().toString(), in); + } + + public void writeStream(String name, InputStream in) { + performOutputExchange( + WriteStreamExchange.Request.builder().name(name).build(), in::transferTo); + } + private BeaconException unwrapException(Exception exception) { if (exception instanceof ServerException s) { return new BeaconException("An internal server error occurred", s); diff --git a/beacon/src/main/java/io/xpipe/beacon/exchange/cli/RemoveStoreExchange.java b/beacon/src/main/java/io/xpipe/beacon/exchange/cli/RemoveStoreExchange.java index e3dc7e5c..95dd9732 100644 --- a/beacon/src/main/java/io/xpipe/beacon/exchange/cli/RemoveStoreExchange.java +++ b/beacon/src/main/java/io/xpipe/beacon/exchange/cli/RemoveStoreExchange.java @@ -21,8 +21,6 @@ public class RemoveStoreExchange implements MessageExchange { public static class Request implements RequestMessage { @NonNull String storeName; - - boolean removeUnderlying; } @Jacksonized diff --git a/beacon/src/main/java/io/xpipe/beacon/exchange/cli/StoreProviderListExchange.java b/beacon/src/main/java/io/xpipe/beacon/exchange/cli/StoreProviderListExchange.java index 653a1062..ee5511dd 100644 --- a/beacon/src/main/java/io/xpipe/beacon/exchange/cli/StoreProviderListExchange.java +++ b/beacon/src/main/java/io/xpipe/beacon/exchange/cli/StoreProviderListExchange.java @@ -10,6 +10,7 @@ import lombok.Value; import lombok.extern.jackson.Jacksonized; import java.util.List; +import java.util.Map; public class StoreProviderListExchange implements MessageExchange { @@ -28,6 +29,6 @@ public class StoreProviderListExchange implements MessageExchange { @Value public static class Response implements ResponseMessage { @NonNull - List entries; + Map> entries; } } diff --git a/beacon/src/main/java/io/xpipe/beacon/exchange/cli/WriteExecuteExchange.java b/beacon/src/main/java/io/xpipe/beacon/exchange/cli/WriteExecuteExchange.java index 12a69790..e0872af3 100644 --- a/beacon/src/main/java/io/xpipe/beacon/exchange/cli/WriteExecuteExchange.java +++ b/beacon/src/main/java/io/xpipe/beacon/exchange/cli/WriteExecuteExchange.java @@ -30,10 +30,14 @@ public class WriteExecuteExchange implements MessageExchange { @NonNull UUID id; + + String mode; } @Jacksonized @Builder @Value - public static class Response implements ResponseMessage {} + public static class Response implements ResponseMessage { + boolean hasBody; + } } diff --git a/beacon/src/main/java/io/xpipe/beacon/exchange/cli/WritePreparationExchange.java b/beacon/src/main/java/io/xpipe/beacon/exchange/cli/WritePreparationExchange.java index 397ca018..269d6e44 100644 --- a/beacon/src/main/java/io/xpipe/beacon/exchange/cli/WritePreparationExchange.java +++ b/beacon/src/main/java/io/xpipe/beacon/exchange/cli/WritePreparationExchange.java @@ -27,8 +27,9 @@ public class WritePreparationExchange implements MessageExchange { public static class Request implements RequestMessage { String type; - @NonNull - DataStore output; + DataStore outputStore; + + DataSourceReference outputSource; @NonNull DataSourceReference source; @@ -38,8 +39,6 @@ public class WritePreparationExchange implements MessageExchange { @Builder @Value public static class Response implements ResponseMessage { - boolean hasBody; - @NonNull DialogReference config; } diff --git a/core/src/main/java/io/xpipe/core/impl/FileNames.java b/core/src/main/java/io/xpipe/core/impl/FileNames.java index 2d9c62a8..923ef368 100644 --- a/core/src/main/java/io/xpipe/core/impl/FileNames.java +++ b/core/src/main/java/io/xpipe/core/impl/FileNames.java @@ -18,6 +18,18 @@ public class FileNames { return normalize(joined); } + public static boolean isAbsolute(String file) { + if (!file.contains("/") && !file.contains("\\")) { + return false; + } + + if (!file.startsWith("/") && !file.startsWith("~") && !file.matches("^\\w:.*")) { + return false; + } + + return true; + } + public static String getParent(String file) { return file.substring(0, file.length() - getFileName(file).length() - 1); } diff --git a/core/src/main/java/io/xpipe/core/impl/FileStore.java b/core/src/main/java/io/xpipe/core/impl/FileStore.java index 151c985a..808bfa9e 100644 --- a/core/src/main/java/io/xpipe/core/impl/FileStore.java +++ b/core/src/main/java/io/xpipe/core/impl/FileStore.java @@ -64,6 +64,9 @@ public class FileStore extends JacksonizedValue implements FilenameStore, Stream if (file == null) { throw new IllegalStateException("File is missing"); } + if (!FileNames.isAbsolute(file)) { + throw new IllegalStateException("File path is not absolute"); + } } @Override diff --git a/core/src/main/java/io/xpipe/core/source/WriteMode.java b/core/src/main/java/io/xpipe/core/source/WriteMode.java index 07e6e064..24dbfc1c 100644 --- a/core/src/main/java/io/xpipe/core/source/WriteMode.java +++ b/core/src/main/java/io/xpipe/core/source/WriteMode.java @@ -14,28 +14,32 @@ public class WriteMode extends JacksonizedValue { public static void init(ModuleLayer layer) { if (ALL.size() == 0) { ALL.addAll(ServiceLoader.load(layer, WriteMode.class).stream() - .map(p -> p.get()) - .toList()); + .map(p -> p.get()) + .toList()); } } @JsonTypeName("replace") - public static final class Replace extends WriteMode { - } + public static final class Replace extends WriteMode {} @JsonTypeName("append") - public static final class Append extends WriteMode { - } + public static final class Append extends WriteMode {} @JsonTypeName("prepend") - public static final class Prepend extends WriteMode { - } + public static final class Prepend extends WriteMode {} public static final Replace REPLACE = new Replace(); public static final Append APPEND = new Append(); public static final Prepend PREPEND = new Prepend(); - public final String getId() { + public final String getId() { return getClass().getAnnotation(JsonTypeName.class).value(); } + + public static WriteMode byId(String id) { + return ALL.stream() + .filter(writeMode -> writeMode.getId().equalsIgnoreCase(id)) + .findFirst() + .orElseThrow(); + } } diff --git a/extension/src/main/java/io/xpipe/extension/event/TrackEvent.java b/extension/src/main/java/io/xpipe/extension/event/TrackEvent.java index 4939d6c4..e6a23ce3 100644 --- a/extension/src/main/java/io/xpipe/extension/event/TrackEvent.java +++ b/extension/src/main/java/io/xpipe/extension/event/TrackEvent.java @@ -112,13 +112,14 @@ public class TrackEvent { if (tags.size() > 0) { s.append(" {\n"); for (var e : tags.entrySet()) { - var value = e.toString().contains("\n") + var valueString = e.getValue() != null ? e.getValue().toString() : "null"; + var value = valueString.contains("\n") ? "\n" - + (e.toString() + + (valueString.toString() .lines() .map(line -> " | " + line) .collect(Collectors.joining("\n"))) - : e.toString(); + : valueString; s.append(" ") .append(e.getKey()) .append("=")