From 5f85d5d9bc4ebbcd22eb5b35b1b84b5513d0b90d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 25 Dec 2020 07:57:33 +0100 Subject: [PATCH] Split reading documentation into separate request to speed up device detection. --- .../li/cil/oc2/common/bus/RPCAdapter.java | 37 +++++++++++++++---- .../serializers/MessageJsonDeserializer.java | 7 +++- ...RPCDeviceWithIdentifierJsonSerializer.java | 6 --- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/main/java/li/cil/oc2/common/bus/RPCAdapter.java b/src/main/java/li/cil/oc2/common/bus/RPCAdapter.java index 557cd0ee..b1743a0b 100644 --- a/src/main/java/li/cil/oc2/common/bus/RPCAdapter.java +++ b/src/main/java/li/cil/oc2/common/bus/RPCAdapter.java @@ -67,7 +67,7 @@ public final class RPCAdapter implements Steppable { .registerTypeAdapter(MethodInvocation.class, new MethodInvocationJsonDeserializer()) .registerTypeAdapter(Message.class, new MessageJsonDeserializer()) .registerTypeAdapter(RPCDeviceWithIdentifier.class, new RPCDeviceWithIdentifierJsonSerializer()) - .registerTypeAdapter(RPCMethod.class, new RPCMethodJsonSerializer()) + .registerTypeHierarchyAdapter(RPCMethod.class, new RPCMethodJsonSerializer()) .create(); } @@ -237,13 +237,24 @@ public final class RPCAdapter implements Steppable { try { final Message message = gson.fromJson(stream, Message.class); switch (message.type) { - case Message.MESSAGE_TYPE_STATUS: { - writeStatus(); + case Message.MESSAGE_TYPE_LIST: { + writeDeviceList(); + break; + } + case Message.MESSAGE_TYPE_METHODS: { + if (message.data != null) { + writeDeviceMethods((UUID) message.data); + } else { + writeError("missing device id"); + } break; } case Message.MESSAGE_TYPE_INVOKE_METHOD: { - assert message.data != null : "MethodInvocation deserializer produced null data."; - processMethodInvocation((MethodInvocation) message.data, false); + if (message.data != null) { + processMethodInvocation((MethodInvocation) message.data, false); + } else { + writeError("missing invocation data"); + } break; } default: { @@ -309,8 +320,17 @@ public final class RPCAdapter implements Steppable { writeError(error); } - private void writeStatus() { - writeMessage(Message.MESSAGE_TYPE_STATUS, devices); + private void writeDeviceList() { + writeMessage(Message.MESSAGE_TYPE_LIST, devices); + } + + private void writeDeviceMethods(final UUID deviceId) { + final RPCDeviceList device = devicesById.get(deviceId); + if (device != null) { + writeMessage(Message.MESSAGE_TYPE_METHODS, device.getMethods()); + } else { + writeError("unknown device"); + } } private void writeError(final String message) { @@ -352,7 +372,8 @@ public final class RPCAdapter implements Steppable { public static final class Message { // Device -> VM - public static final String MESSAGE_TYPE_STATUS = "status"; + public static final String MESSAGE_TYPE_LIST = "list"; + public static final String MESSAGE_TYPE_METHODS = "methods"; public static final String MESSAGE_TYPE_RESULT = "result"; public static final String MESSAGE_TYPE_ERROR = "error"; diff --git a/src/main/java/li/cil/oc2/common/serialization/serializers/MessageJsonDeserializer.java b/src/main/java/li/cil/oc2/common/serialization/serializers/MessageJsonDeserializer.java index 2ba361a2..1e1431bb 100644 --- a/src/main/java/li/cil/oc2/common/serialization/serializers/MessageJsonDeserializer.java +++ b/src/main/java/li/cil/oc2/common/serialization/serializers/MessageJsonDeserializer.java @@ -4,6 +4,7 @@ import com.google.gson.*; import li.cil.oc2.common.bus.RPCAdapter; import java.lang.reflect.Type; +import java.util.UUID; public final class MessageJsonDeserializer implements JsonDeserializer { @Override @@ -12,10 +13,14 @@ public final class MessageJsonDeserializer implements JsonDeserializer