From: AsamK Date: Wed, 10 Nov 2021 18:21:51 +0000 (+0100) Subject: Add JsonRpcMultiCommand X-Git-Tag: v0.10.0~58 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/9c67aabebb1d6114eddebe19e36f73fb76691c05 Add JsonRpcMultiCommand --- diff --git a/src/main/java/org/asamk/signal/commands/DaemonCommand.java b/src/main/java/org/asamk/signal/commands/DaemonCommand.java index 51a5c947..5e715647 100644 --- a/src/main/java/org/asamk/signal/commands/DaemonCommand.java +++ b/src/main/java/org/asamk/signal/commands/DaemonCommand.java @@ -38,7 +38,7 @@ import java.util.Objects; import java.util.function.Consumer; import java.util.stream.Collectors; -public class DaemonCommand implements MultiLocalCommand { +public class DaemonCommand implements MultiLocalCommand, LocalCommand { private final static Logger logger = LoggerFactory.getLogger(DaemonCommand.class); diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcLocalCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcLocalCommand.java index d98b1585..5baadf52 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcLocalCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcLocalCommand.java @@ -4,8 +4,8 @@ import com.fasterxml.jackson.core.type.TypeReference; import net.sourceforge.argparse4j.inf.Namespace; +import org.asamk.signal.JsonWriter; import org.asamk.signal.OutputType; -import org.asamk.signal.OutputWriter; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.manager.Manager; @@ -19,10 +19,10 @@ public interface JsonRpcLocalCommand extends JsonRpcSingleCommand request, Manager m, OutputWriter outputWriter + Map request, Manager m, JsonWriter jsonWriter ) throws CommandException { Namespace commandNamespace = new JsonRpcNamespace(request == null ? Map.of() : request); - handleCommand(commandNamespace, m, outputWriter); + handleCommand(commandNamespace, m, jsonWriter); } default List getSupportedOutputTypes() { diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcMultiCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcMultiCommand.java new file mode 100644 index 00000000..3f5b04a0 --- /dev/null +++ b/src/main/java/org/asamk/signal/commands/JsonRpcMultiCommand.java @@ -0,0 +1,9 @@ +package org.asamk.signal.commands; + +import org.asamk.signal.JsonWriter; +import org.asamk.signal.commands.exceptions.CommandException; + +public interface JsonRpcMultiCommand extends JsonRpcCommand { + + void handleCommand(T request, SignalCreator c, JsonWriter jsonWriter) throws CommandException; +} diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcMultiLocalCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcMultiLocalCommand.java new file mode 100644 index 00000000..1701ac8c --- /dev/null +++ b/src/main/java/org/asamk/signal/commands/JsonRpcMultiLocalCommand.java @@ -0,0 +1,30 @@ +package org.asamk.signal.commands; + +import com.fasterxml.jackson.core.type.TypeReference; + +import net.sourceforge.argparse4j.inf.Namespace; + +import org.asamk.signal.JsonWriter; +import org.asamk.signal.OutputType; +import org.asamk.signal.commands.exceptions.CommandException; + +import java.util.List; +import java.util.Map; + +public interface JsonRpcMultiLocalCommand extends JsonRpcMultiCommand>, MultiLocalCommand { + + default TypeReference> getRequestType() { + return new TypeReference<>() {}; + } + + default void handleCommand( + Map request, SignalCreator c, JsonWriter jsonWriter + ) throws CommandException { + Namespace commandNamespace = new JsonRpcNamespace(request == null ? Map.of() : request); + handleCommand(commandNamespace, c, jsonWriter); + } + + default List getSupportedOutputTypes() { + return List.of(OutputType.PLAIN_TEXT, OutputType.JSON); + } +} diff --git a/src/main/java/org/asamk/signal/commands/JsonRpcSingleCommand.java b/src/main/java/org/asamk/signal/commands/JsonRpcSingleCommand.java index 14d2b864..05ca6932 100644 --- a/src/main/java/org/asamk/signal/commands/JsonRpcSingleCommand.java +++ b/src/main/java/org/asamk/signal/commands/JsonRpcSingleCommand.java @@ -1,10 +1,10 @@ package org.asamk.signal.commands; -import org.asamk.signal.OutputWriter; +import org.asamk.signal.JsonWriter; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.manager.Manager; public interface JsonRpcSingleCommand extends JsonRpcCommand { - void handleCommand(T request, Manager m, OutputWriter outputWriter) throws CommandException; + void handleCommand(T request, Manager m, JsonWriter jsonWriter) throws CommandException; } diff --git a/src/main/java/org/asamk/signal/commands/MultiLocalCommand.java b/src/main/java/org/asamk/signal/commands/MultiLocalCommand.java index f333d3a5..9cc6846c 100644 --- a/src/main/java/org/asamk/signal/commands/MultiLocalCommand.java +++ b/src/main/java/org/asamk/signal/commands/MultiLocalCommand.java @@ -5,9 +5,7 @@ import net.sourceforge.argparse4j.inf.Namespace; import org.asamk.signal.OutputWriter; import org.asamk.signal.commands.exceptions.CommandException; -public interface MultiLocalCommand extends LocalCommand { +public interface MultiLocalCommand extends CliCommand { - void handleCommand( - Namespace ns, SignalCreator c, OutputWriter outputWriter - ) throws CommandException; + void handleCommand(Namespace ns, SignalCreator c, OutputWriter outputWriter) throws CommandException; } diff --git a/src/main/java/org/asamk/signal/commands/VersionCommand.java b/src/main/java/org/asamk/signal/commands/VersionCommand.java index 134bffa0..7263efac 100644 --- a/src/main/java/org/asamk/signal/commands/VersionCommand.java +++ b/src/main/java/org/asamk/signal/commands/VersionCommand.java @@ -2,13 +2,12 @@ package org.asamk.signal.commands; import org.asamk.signal.BaseConfig; import org.asamk.signal.JsonWriter; -import org.asamk.signal.OutputWriter; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.manager.Manager; import java.util.Map; -public class VersionCommand implements JsonRpcSingleCommand { +public class VersionCommand implements JsonRpcSingleCommand, JsonRpcMultiCommand { @Override public String getName() { @@ -17,9 +16,19 @@ public class VersionCommand implements JsonRpcSingleCommand { @Override public void handleCommand( - final Void request, final Manager m, final OutputWriter outputWriter + final Void request, final Manager m, final JsonWriter jsonWriter ) throws CommandException { - final var jsonWriter = (JsonWriter) outputWriter; + outputVersion(jsonWriter); + } + + @Override + public void handleCommand( + final Void request, final SignalCreator c, final JsonWriter jsonWriter + ) throws CommandException { + outputVersion(jsonWriter); + } + + private void outputVersion(final JsonWriter jsonWriter) { jsonWriter.write(Map.of("version", BaseConfig.PROJECT_VERSION)); } } diff --git a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java index b301f0d9..d8a984f3 100644 --- a/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java +++ b/src/main/java/org/asamk/signal/jsonrpc/SignalJsonRpcDispatcherHandler.java @@ -9,9 +9,9 @@ import com.fasterxml.jackson.databind.node.ContainerNode; import org.asamk.signal.JsonReceiveMessageHandler; import org.asamk.signal.JsonWriter; -import org.asamk.signal.OutputWriter; import org.asamk.signal.commands.Command; import org.asamk.signal.commands.Commands; +import org.asamk.signal.commands.JsonRpcMultiCommand; import org.asamk.signal.commands.JsonRpcSingleCommand; import org.asamk.signal.commands.SignalCreator; import org.asamk.signal.commands.exceptions.CommandException; @@ -48,11 +48,11 @@ public class SignalJsonRpcDispatcherHandler { private Manager m; public SignalJsonRpcDispatcherHandler( - final JsonWriter outputWriter, final Supplier lineSupplier, final boolean noReceiveOnStart + final JsonWriter jsonWriter, final Supplier lineSupplier, final boolean noReceiveOnStart ) { this.noReceiveOnStart = noReceiveOnStart; this.objectMapper = Util.createJsonObjectMapper(); - this.jsonRpcSender = new JsonRpcSender(outputWriter); + this.jsonRpcSender = new JsonRpcSender(jsonWriter); this.jsonRpcReader = new JsonRpcReader(jsonRpcSender, lineSupplier); } @@ -120,6 +120,9 @@ public class SignalJsonRpcDispatcherHandler { ) throws JsonRpcException { var command = getCommand(method); // TODO implement listAccounts, register, verify, link + if (c != null && command instanceof JsonRpcMultiCommand jsonRpcCommand) { + return runCommand(objectMapper, params, new MultiCommandRunnerImpl<>(c, jsonRpcCommand)); + } if (command instanceof JsonRpcSingleCommand jsonRpcCommand) { if (m != null) { return runCommand(objectMapper, params, new CommandRunnerImpl<>(m, jsonRpcCommand)); @@ -155,8 +158,23 @@ public class SignalJsonRpcDispatcherHandler { private record CommandRunnerImpl(Manager m, JsonRpcSingleCommand command) implements CommandRunner { @Override - public void handleCommand(final T request, final OutputWriter outputWriter) throws CommandException { - command.handleCommand(request, m, outputWriter); + public void handleCommand(final T request, final JsonWriter jsonWriter) throws CommandException { + command.handleCommand(request, m, jsonWriter); + } + + @Override + public TypeReference getRequestType() { + return command.getRequestType(); + } + } + + private record MultiCommandRunnerImpl( + SignalCreator c, JsonRpcMultiCommand command + ) implements CommandRunner { + + @Override + public void handleCommand(final T request, final JsonWriter jsonWriter) throws CommandException { + command.handleCommand(request, c, jsonWriter); } @Override @@ -167,7 +185,7 @@ public class SignalJsonRpcDispatcherHandler { interface CommandRunner { - void handleCommand(T request, OutputWriter outputWriter) throws CommandException; + void handleCommand(T request, JsonWriter jsonWriter) throws CommandException; TypeReference getRequestType(); } @@ -176,7 +194,7 @@ public class SignalJsonRpcDispatcherHandler { final ObjectMapper objectMapper, final ContainerNode params, final CommandRunner command ) throws JsonRpcException { final Object[] result = {null}; - final JsonWriter commandOutputWriter = s -> { + final JsonWriter commandJsonWriter = s -> { if (result[0] != null) { throw new AssertionError("Command may only write one json result"); } @@ -185,7 +203,7 @@ public class SignalJsonRpcDispatcherHandler { }; try { - parseParamsAndRunCommand(objectMapper, params, commandOutputWriter, command); + parseParamsAndRunCommand(objectMapper, params, commandJsonWriter, command); } catch (JsonMappingException e) { throw new JsonRpcException(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_REQUEST, e.getMessage(), @@ -210,7 +228,7 @@ public class SignalJsonRpcDispatcherHandler { private void parseParamsAndRunCommand( final ObjectMapper objectMapper, final TreeNode params, - final OutputWriter outputWriter, + final JsonWriter jsonWriter, final CommandRunner command ) throws CommandException, JsonMappingException { T requestParams = null; @@ -224,7 +242,7 @@ public class SignalJsonRpcDispatcherHandler { throw new AssertionError(e); } } - command.handleCommand(requestParams, outputWriter); + command.handleCommand(requestParams, jsonWriter); } private class SubscribeReceiveCommand implements JsonRpcSingleCommand { @@ -236,7 +254,7 @@ public class SignalJsonRpcDispatcherHandler { @Override public void handleCommand( - final Void request, final Manager m, final OutputWriter outputWriter + final Void request, final Manager m, final JsonWriter jsonWriter ) throws CommandException { subscribeReceive(m); } @@ -251,7 +269,7 @@ public class SignalJsonRpcDispatcherHandler { @Override public void handleCommand( - final Void request, final Manager m, final OutputWriter outputWriter + final Void request, final Manager m, final JsonWriter jsonWriter ) throws CommandException { unsubscribeReceive(m); }