diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2017-11-05 21:03:12 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2017-11-05 21:03:12 +0200 |
| commit | baba3a2745e1e7f28e0d1bcfb3d83db6eb4e6a41 (patch) | |
| tree | d42e000dd8e771a9759b2d0d7884d234cc67a5d9 | |
| parent | 1ee327a07b6e2e35ee69658a324ca51da83d7756 (diff) | |
| download | Tango-baba3a2745e1e7f28e0d1bcfb3d83db6eb4e6a41.tar.gz Tango-baba3a2745e1e7f28e0d1bcfb3d83db6eb4e6a41.zip | |
Implemented Generic MessageFactory & TangoMessage in Java.
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()); + } } |
