aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2017-11-05 21:03:12 +0200
committerRoy Ben-Shabat <Roy@Twine-s.com>2017-11-05 21:03:12 +0200
commitbaba3a2745e1e7f28e0d1bcfb3d83db6eb4e6a41 (patch)
treed42e000dd8e771a9759b2d0d7884d234cc67a5d9 /Software
parent1ee327a07b6e2e35ee69658a324ca51da83d7756 (diff)
downloadTango-baba3a2745e1e7f28e0d1bcfb3d83db6eb4e6a41.tar.gz
Tango-baba3a2745e1e7f28e0d1bcfb3d83db6eb4e6a41.zip
Implemented Generic MessageFactory & TangoMessage in Java.
Diffstat (limited to 'Software')
-rw-r--r--Software/Android-Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java36
-rw-r--r--Software/Android-Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java74
-rw-r--r--Software/Android-Studio/app/src/test/java/com/twine/tango/PMR_TST.java18
3 files changed, 128 insertions, 0 deletions
diff --git a/Software/Android-Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java b/Software/Android-Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java
new file mode 100644
index 000000000..aa00ca4aa
--- /dev/null
+++ b/Software/Android-Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java
@@ -0,0 +1,36 @@
+package com.twine.tango.pmr;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.Parser;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Created by Roy on 11/5/2017.
+ */
+
+public class MessageFactory {
+
+ public static <T extends com.google.protobuf.GeneratedMessageV3> TangoMessage<T> createContainer(Class<T> typeName) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
+ String a = typeName.getSimpleName();
+
+ Method newBuilder = typeName.getMethod("newBuilder");
+ Object builder = newBuilder.invoke(null);
+
+ Method build = builder.getClass().getMethod("build");
+ Object instance = build.invoke(builder);
+
+ TangoMessage<T> message = new TangoMessage<>((T)instance, MessageType.valueOf(typeName.getSimpleName()));
+ return message;
+ }
+
+ public static <T extends com.google.protobuf.GeneratedMessageV3> TangoMessage<T> parseContainer(byte[] data, Class<T> typeName) throws InvalidProtocolBufferException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+ MessageContainer container = MessageContainer.parseFrom(data);
+ Parser<T> parser = (Parser<T>) typeName.getMethod("parser").invoke(null);
+ TangoMessage<T> tangoMessage = new TangoMessage<>(parser.parseFrom(container.getData()), container.getType());
+ return tangoMessage;
+ }
+}
diff --git a/Software/Android-Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java b/Software/Android-Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java
new file mode 100644
index 000000000..57fc4bcb6
--- /dev/null
+++ b/Software/Android-Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java
@@ -0,0 +1,74 @@
+package com.twine.tango.pmr;
+
+import com.twine.tango.pmr.common.MessageContainerOuterClass;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
+
+/**
+ * Created by Roy on 11/5/2017.
+ */
+
+
+/**
+ * Generic Tango message wrapper.
+ * @param <T>
+ */
+public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
+
+ private T message;
+ private MessageType type;
+
+ /**
+ * Initialize a new instance of Tango message.
+ * @param message The message.
+ * @param type The message type.
+ */
+ public TangoMessage(T message, MessageType type) {
+ this.message = message;
+ this.type = type;
+ }
+
+ /**
+ * Gets the inner message.
+ * @return The inner message.
+ */
+ public T getMessage() {
+ return message;
+ }
+
+ /**
+ * Sets the inner message.
+ * @param message The inner message.
+ */
+ public void setMessage(T message) {
+ this.message = message;
+ }
+
+ /**
+ * Gets the inner message type.
+ * @return The inner message type.
+ */
+ public MessageType getType() {
+ return type;
+ }
+
+ /**
+ * Sets the inner message type.
+ * @param type Inner message type.
+ */
+ public void setType(MessageType type) {
+ this.type = type;
+ }
+
+ /**
+ * Serializes the container and message to byte array.
+ * @return Container and message byte array.
+ */
+ public byte[] toBytes()
+ {
+ MessageContainer.Builder container = MessageContainer.newBuilder();
+ container.setType(getType());
+ container.setData(getMessage().toByteString());
+ return container.build().toByteArray();
+ }
+}
diff --git a/Software/Android-Studio/app/src/test/java/com/twine/tango/PMR_TST.java b/Software/Android-Studio/app/src/test/java/com/twine/tango/PMR_TST.java
index 78799bc74..c85365474 100644
--- a/Software/Android-Studio/app/src/test/java/com/twine/tango/PMR_TST.java
+++ b/Software/Android-Studio/app/src/test/java/com/twine/tango/PMR_TST.java
@@ -2,12 +2,17 @@ package com.twine.tango;
import org.junit.Test;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.twine.tango.pmr.MessageFactory;
+import com.twine.tango.pmr.TangoMessage;
import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
import com.twine.tango.pmr.common.RGBOuterClass.RGB;
import com.twine.tango.pmr.jobs.JobOuterClass.Job;
import com.twine.tango.pmr.jobs.SegmentOuterClass.Segment;
+import java.lang.reflect.InvocationTargetException;
+
import static org.junit.Assert.assertEquals;
/**
@@ -52,4 +57,17 @@ public class PMR_TST {
assertEquals(buildJob, parsedJob);
}
+
+ @Test
+ public void read_write_PMR_Generic() throws InstantiationException, IllegalAccessException, InvalidProtocolBufferException, NoSuchMethodException, InvocationTargetException {
+
+ TangoMessage<Job> message = MessageFactory.createContainer(Job.class);
+ message.setMessage(Job.newBuilder().setName("Roy").build());
+
+ byte[] bytes = message.toBytes();
+
+ TangoMessage<Job> parsed = MessageFactory.parseContainer(bytes,Job.class);
+
+ assertEquals(message.getMessage(), parsed.getMessage());
+ }
}