aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Android_Studio
diff options
context:
space:
mode:
authorRoy <roy.mail.net@gmail.com>2018-01-03 01:57:58 +0200
committerRoy <roy.mail.net@gmail.com>2018-01-03 01:57:58 +0200
commit63b2a192ba12f8239668b6818db4ad02db68dbbc (patch)
treec9c1de011b38fbff94ce87ac2771667b9a3e773d /Software/Android_Studio
parentf917366c405a4308b4b60e30eb1bd0dcf880532c (diff)
downloadTango-63b2a192ba12f8239668b6818db4ad02db68dbbc.tar.gz
Tango-63b2a192ba12f8239668b6818db4ad02db68dbbc.zip
Implemented abstraction of message encoding/decoding by adding another layer of "Encoders" to Transporters.
Diffstat (limited to 'Software/Android_Studio')
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java4
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java4
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/ITangoMessage.java24
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java26
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java47
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java15
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportEncoder.java30
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java14
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java82
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java138
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/encoders/ProtoEncoder.java29
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/BasicTransporter.java6
12 files changed, 276 insertions, 143 deletions
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java
index f23c8c705..c690435f9 100644
--- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java
@@ -1,13 +1,13 @@
package com.twine.tango.integration.operators;
import com.twine.tango.transport.ITransportAdapter;
-import com.twine.tango.transport.transporters.ProtoTransporter;
+import com.twine.tango.transport.transporters.BasicTransporter;
/**
* Created by Roy on 12/23/2017.
*/
-public class MachineOperator extends ProtoTransporter implements IMachineOperator
+public class MachineOperator extends BasicTransporter implements IMachineOperator
{
public MachineOperator()
{
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java
index 4788a8082..189c21d3f 100644
--- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java
@@ -21,7 +21,7 @@ import com.twine.tango.pmr.integration.ExternalClientLoginRequestOuterClass.Exte
import com.twine.tango.pmr.integration.ExternalClientLoginResponseOuterClass.ExternalClientLoginResponse;
import com.twine.tango.transport.ResponseErrorException;
import com.twine.tango.transport.adapters.TcpTransportAdapter;
-import com.twine.tango.transport.transporters.ProtoTransporter;
+import com.twine.tango.transport.transporters.BasicTransporter;
import java.io.IOException;
import java.net.DatagramPacket;
@@ -40,7 +40,7 @@ import static br.com.zbra.androidlinq.Linq.stream;
* Created by Roy on 12/22/2017.
*/
-public class ExternalBridgeService extends ProtoTransporter implements IExternalBridgeService
+public class ExternalBridgeService extends BasicTransporter implements IExternalBridgeService
{
private ServerSocket listener;
private boolean isStarted;
diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/ITangoMessage.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/ITangoMessage.java
index 83153d154..f64411a62 100644
--- a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/ITangoMessage.java
+++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/ITangoMessage.java
@@ -1,9 +1,31 @@
package com.twine.tango.pmr;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
+
/**
* Created by Roy on 1/3/2018.
*/
-
public interface ITangoMessage
{
+ /**
+ * Gets the container that will encapsulate the actual PMR message.
+ *
+ * @return the container
+ */
+ MessageContainer.Builder getContainer();
+
+ /**
+ * Gets or sets the PMR message type.
+ *
+ * @return the type
+ */
+ MessageType getType();
+
+ /**
+ * Serializes the Tango message to byte array.
+ *
+ * @return the byte [ ]
+ */
+ byte[] toBytes();
}
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
index 413824e8d..689d2c25a 100644
--- 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
@@ -121,6 +121,7 @@ public class MessageFactory
*
* @param <T> the type parameter
* @param typeName the type name
+ * @param message the message
* @param token the token
* @return the tango message
*/
@@ -135,9 +136,8 @@ public class MessageFactory
/**
* Creates a new tango message with the specified message token.
*
- * @param <T> the type parameter
- * @param typeName the type name
- * @param token the token
+ * @param container the container
+ * @param message the message
* @return the tango message
*/
public static TangoMessage createTangoMessage(MessageContainer container, GeneratedMessageV3 message)
@@ -188,6 +188,24 @@ public class MessageFactory
}
}
+
+ /**
+ * Parses the specified byte array to an unknown Tango message type.
+ *
+ * @param data the data
+ * @return the tango message
+ * @throws InvalidProtocolBufferException the invalid protocol buffer exception
+ * @throws NoSuchMethodException the no such method exception
+ * @throws IllegalAccessException the illegal access exception
+ * @throws InvocationTargetException the invocation target exception
+ */
+ public static TangoMessage parseTangoMessageAgnostic(byte[] data) throws InvalidProtocolBufferException, NoSuchMethodException, IllegalAccessException, InvocationTargetException
+ {
+ MessageContainer container = parseContainer(data);
+ GeneratedMessageV3 message = parseMessageFromContainerAgnostic(container);
+ return MessageFactory.createTangoMessage(container, message);
+ }
+
/**
* Parses the internal PMR message from the message container.
*
@@ -212,7 +230,7 @@ public class MessageFactory
* Parses the internal PMR message from the message container and returns the basic protobuf message interface.
*
* @param container the container
- * @return GeneratedMessageV3
+ * @return GeneratedMessageV3 generated message v 3
* @throws NoSuchMethodException the no such method exception
* @throws InvocationTargetException the invocation target exception
* @throws IllegalAccessException the illegal access exception
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
index 8403f2cab..eaf6de233 100644
--- 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
@@ -1,6 +1,7 @@
package com.twine.tango.pmr;
import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer.Builder;
import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
import java.lang.reflect.ParameterizedType;
@@ -12,8 +13,9 @@ import java.util.UUID;
*
* @param <T> the type parameter
*/
-public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
-
+public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> implements ITangoMessage
+{
+
private T message;
private MessageType type;
private MessageContainer.Builder container;
@@ -24,10 +26,11 @@ public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
* @param message The message.
* @param type The message type.
*/
- public TangoMessage(T message, MessageType type) {
+ public TangoMessage(T message, MessageType type)
+ {
this.message = message;
this.type = type;
-
+
this.container = MessageContainer.newBuilder()
.setToken(UUID.randomUUID().toString())
.setType(type);
@@ -38,7 +41,8 @@ public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
*
* @return The inner message.
*/
- public T getMessage() {
+ public T getMessage()
+ {
return message;
}
@@ -47,16 +51,14 @@ public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
*
* @param message The inner message.
*/
- public void setMessage(T message) {
+ public void setMessage(T message)
+ {
this.message = message;
}
- /**
- * Gets the inner message type.
- *
- * @return The inner message type.
- */
- public MessageType getType() {
+ @Override
+ public MessageType getType()
+ {
return type;
}
@@ -65,16 +67,14 @@ public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
*
* @param type Inner message type.
*/
- public void setType(MessageType type) {
+ public void setType(MessageType type)
+ {
this.type = type;
}
- /**
- * Gets the message container.
- *
- * @return the message container.
- */
- public MessageContainer.Builder getContainer() {
+ @Override
+ public Builder getContainer()
+ {
return container;
}
@@ -83,15 +83,12 @@ public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
*
* @param container the container
*/
- public void setContainer(MessageContainer.Builder container) {
+ public void setContainer(MessageContainer.Builder container)
+ {
this.container = container;
}
- /**
- * Serializes the container and message to byte array.
- *
- * @return Container and message byte array.
- */
+ @Override
public byte[] toBytes()
{
container.setData(message.toByteString());
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java
index 2e076b1c8..0d46d9e0f 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java
@@ -54,7 +54,6 @@ public interface ITransportAdapter extends ITransportComponent {
*/
TransportAdapterMode getAdapterMode();
-
/**
* Gets whether this adapter is authenticated.
*
@@ -68,4 +67,18 @@ public interface ITransportAdapter extends ITransportComponent {
* @param authenticated the authenticated
*/
void setAuthenticated(boolean authenticated);
+
+ /**
+ * Gets the total number of bytes received.
+ *
+ * @return the total bytes received
+ */
+ long getTotalBytesReceived();
+
+ /**
+ * Gets the total number of bytes sent.
+ *
+ * @return the total bytes sent
+ */
+ long getTotalBytesSent();
}
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportEncoder.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportEncoder.java
index 96013d3d1..5279655ca 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportEncoder.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportEncoder.java
@@ -1,9 +1,35 @@
package com.twine.tango.transport;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.twine.tango.pmr.ITangoMessage;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+
/**
- * Created by Roy on 1/3/2018.
+ * Represents a Transport message encoder capable of encoding or decoding {@link ITangoMessage}.
*/
-
public interface ITransportEncoder
{
+ /**
+ * Encodes the specified tango message.
+ *
+ * @param tangoMessage the tango message
+ * @return the byte [ ]
+ */
+ byte[] encode(ITangoMessage tangoMessage);
+
+ /**
+ * Decodes the specified data.
+ *
+ * @param data the data
+ * @return the tango message
+ */
+ ITangoMessage decode(byte[] data);
+
+ /**
+ * Decodes only the message container part from the specified data.
+ *
+ * @param data the data
+ * @return the message container
+ */
+ MessageContainer decodeContainer(byte[] data) throws InvalidProtocolBufferException;
}
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java
index 5531f69c9..161a71dce 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java
@@ -34,6 +34,20 @@ public interface ITransporter extends ITransportComponent
void setAdapter(ITransportAdapter adapter);
/**
+ * Gets the transport encoder used to encode and decode the messages.
+ *
+ * @return the encoder
+ */
+ ITransportEncoder getEncoder();
+
+ /**
+ * Sets the transport encoder used to encode and decode the messages.
+ *
+ * @param encoder the encoder
+ */
+ void setEncoder(ITransportEncoder encoder);
+
+ /**
* Send a request to all adapters.
*
* @param <Request> the type parameter
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java
index e3335ad92..e88ce5dab 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java
@@ -18,13 +18,20 @@ import io.reactivex.Completable;
*/
public abstract class TransportAdapterBase implements ITransportAdapter
{
- protected static final int MAX_BUFFER_SIZE = 1024; //10 MB.
+ /**
+ * The constant MAX_BUFFER_SIZE.
+ */
+ protected static final int MAX_BUFFER_SIZE = 1024; //1 KB.
private boolean isAuthenticated;
private String address;
private Event<TransportComponentState> stateChangedEvent;
private IEventHandler<byte[]> dataAvailableListener;
private TransportComponentState state;
private TransportAdapterMode adapterMode;
+ private long totalBytesReceived;
+ private long totalBytesSent;
+
+ //region Constructors
/**
* Instantiates a new Transport adapter base.
@@ -36,6 +43,10 @@ public abstract class TransportAdapterBase implements ITransportAdapter
setAuthenticated(true);
}
+ //endregion
+
+ //region Public Methods
+
public abstract void write(byte[] data) throws ObjectDisposedException, IOException;
public abstract Completable connect();
@@ -49,6 +60,29 @@ public abstract class TransportAdapterBase implements ITransportAdapter
}
@Override
+ public void dispose()
+ {
+ disconnect().blockingAwait();
+ setState(TransportComponentState.Disposed);
+ }
+
+ @Override
+ public void addStateChangedListener(IEventHandler<TransportComponentState> listener)
+ {
+ stateChangedEvent.addListener(listener);
+ }
+
+ @Override
+ public void removeStateChangedListener(IEventHandler<TransportComponentState> listener)
+ {
+ stateChangedEvent.removeListener(listener);
+ }
+
+ //endregion
+
+ //region Properties
+
+ @Override
public String getAddress()
{
return this.address;
@@ -85,18 +119,6 @@ public abstract class TransportAdapterBase implements ITransportAdapter
}
@Override
- public void addStateChangedListener(IEventHandler<TransportComponentState> listener)
- {
- stateChangedEvent.addListener(listener);
- }
-
- @Override
- public void removeStateChangedListener(IEventHandler<TransportComponentState> listener)
- {
- stateChangedEvent.removeListener(listener);
- }
-
- @Override
public TransportComponentState getState()
{
return state;
@@ -123,12 +145,21 @@ public abstract class TransportAdapterBase implements ITransportAdapter
}
@Override
- public void dispose()
+ public long getTotalBytesReceived()
{
- disconnect().blockingAwait();
- setState(TransportComponentState.Disposed);
+ return totalBytesReceived;
+ }
+
+ @Override
+ public long getTotalBytesSent()
+ {
+ return totalBytesSent;
}
+ //endregion
+
+ //region Protected Methods
+
/**
* Throws an exception if the component is in a disposed state.
*
@@ -153,6 +184,7 @@ public abstract class TransportAdapterBase implements ITransportAdapter
{
try
{
+ totalBytesReceived += data.length;
dataAvailableListener.invoke(this, data);
} catch (Exception e)
{
@@ -181,16 +213,26 @@ public abstract class TransportAdapterBase implements ITransportAdapter
*/
protected byte[] postProcessBuffer(byte[] data)
{
+ byte[] postData = data;
+
if (adapterMode == TransportAdapterMode.NO_HEADER)
{
- return data;
+ postData = data;
} else
{
byte[] size = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(data.length).array();
- return concatByteArrays(size, data);
+ postData = concatByteArrays(size, data);
}
+
+ totalBytesSent += postData.length;
+
+ return postData;
}
+ //endregion
+
+ //region Private Methods
+
/**
* Concat byte arrays byte [ ].
*
@@ -198,10 +240,12 @@ public abstract class TransportAdapterBase implements ITransportAdapter
* @param second the second
* @return the byte [ ]
*/
- protected byte[] concatByteArrays(byte[] first, byte[] second)
+ private byte[] concatByteArrays(byte[] first, byte[] second)
{
byte[] result = Arrays.copyOf(first, first.length + second.length);
System.arraycopy(second, 0, result, first.length, second.length);
return result;
}
+
+ //endregion
}
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java
index 8901b4c20..2a7e13711 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java
@@ -5,9 +5,7 @@ import android.os.SystemClock;
import com.elvishew.xlog.XLog;
import com.google.protobuf.GeneratedMessageV3;
-import com.google.protobuf.InvalidProtocolBufferException;
import com.twine.tango.core.Event;
-import com.twine.tango.core.Func;
import com.twine.tango.core.IEventHandler;
import com.twine.tango.core.ObjectDisposedException;
import com.twine.tango.pmr.MessageFactory;
@@ -17,10 +15,10 @@ import com.twine.tango.pmr.common.KeepAliveRequestOuterClass.KeepAliveRequest;
import com.twine.tango.pmr.common.KeepAliveResponseOuterClass.KeepAliveResponse;
import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
+import com.twine.tango.transport.encoders.ProtoEncoder;
import org.joda.time.Period;
-import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -55,6 +53,7 @@ public abstract class TransporterBase implements ITransporter
private Period requestTimeout;
private boolean useKeepAlive;
private boolean failsWithAdapter;
+ private ITransportEncoder encoder;
//region Events
@@ -94,6 +93,18 @@ public abstract class TransporterBase implements ITransporter
}
@Override
+ public ITransportEncoder getEncoder()
+ {
+ return encoder;
+ }
+
+ @Override
+ public void setEncoder(ITransportEncoder encoder)
+ {
+ this.encoder = encoder;
+ }
+
+ @Override
public TransportComponentState getState()
{
return state;
@@ -175,25 +186,6 @@ public abstract class TransporterBase implements ITransporter
}
/**
- * On serializing message func.
- *
- * @param <T> the type parameter
- * @param message the message
- * @return the func
- */
- protected <T extends GeneratedMessageV3> Func<byte[]> onSerializingMessage(TangoMessage<T> message)
- {
- return new Func<byte[]>()
- {
- @Override
- public byte[] invoke()
- {
- return message.toBytes();
- }
- };
- }
-
- /**
* On failed.
*
* @param ex the ex
@@ -215,40 +207,6 @@ public abstract class TransporterBase implements ITransporter
if (requestReceivedListener != null) requestReceivedListener.invoke(this, request);
}
- /**
- * On parse container message container.
- *
- * @param data the data
- * @return the message container
- * @throws InvalidProtocolBufferException the invalid protocol buffer exception
- */
- protected MessageContainer onParseContainer(byte[] data) throws InvalidProtocolBufferException
- {
- return MessageFactory.parseContainer(data);
- }
-
- /**
- * On parse message generated message v 3.
- *
- * @param container the container
- * @return the generated message v 3
- * @throws InvalidProtocolBufferException the invalid protocol buffer exception
- * @throws NoSuchMethodException the no such method exception
- * @throws IllegalAccessException the illegal access exception
- * @throws InvocationTargetException the invocation target exception
- */
- protected GeneratedMessageV3 onParseMessage(MessageContainer container) throws InvalidProtocolBufferException, NoSuchMethodException, IllegalAccessException, InvocationTargetException
- {
- return MessageFactory.parseMessageFromContainerAgnostic(container);
- }
-
- protected TangoMessage onParseTangoMessage(byte[] data) throws InvalidProtocolBufferException, NoSuchMethodException, IllegalAccessException, InvocationTargetException
- {
- MessageContainer container = onParseContainer(data);
- GeneratedMessageV3 message = onParseMessage(container);
- return MessageFactory.createTangoMessage(container, message);
- }
-
//endregion
//region Constructors
@@ -258,6 +216,7 @@ public abstract class TransporterBase implements ITransporter
*/
public TransporterBase()
{
+ setEncoder(new ProtoEncoder());
stateChangedEvent = new Event<>();
pendingResponses = new HashMap<>();
sendingQueue = new ConcurrentLinkedQueue<>();
@@ -318,7 +277,8 @@ public abstract class TransporterBase implements ITransporter
XLog.i("Transporter connected...");
x.onComplete();
- } catch (Exception e)
+ }
+ catch (Exception e)
{
XLog.e("Error connecting transporter", e);
x.onError(e);
@@ -345,7 +305,8 @@ public abstract class TransporterBase implements ITransporter
XLog.i("Transporter disconnected...");
x.onComplete();
- } catch (Exception e)
+ }
+ catch (Exception e)
{
x.onError(e);
}
@@ -366,7 +327,7 @@ public abstract class TransporterBase implements ITransporter
XLog.i("Expected response: " + Response.Builder.class.getSimpleName());
PublishSubject<TangoMessage<Response>> subject = PublishSubject.create();
- TransportMessage<TangoMessage<Response>> message = new TransportMessage<>(request.getContainer().getToken(), request, TransportMessageDirection.Request, onSerializingMessage(request), subject);
+ TransportMessage<TangoMessage<Response>> message = new TransportMessage<>(request.getContainer().getToken(), request, TransportMessageDirection.Request, () -> encoder.encode(request), subject);
sendingQueue.add(message);
Completable.timer(getRequestTimeout().getSeconds(), TimeUnit.SECONDS)
@@ -394,7 +355,7 @@ public abstract class TransporterBase implements ITransporter
request.getContainer().setCompleted(false);
PublishSubject<TangoMessage<Response>> subject = PublishSubject.create();
- TransportMessage<TangoMessage<Response>> message = new TransportMessage<>(request.getContainer().getToken(), request, TransportMessageDirection.Request, onSerializingMessage(request), subject);
+ TransportMessage<TangoMessage<Response>> message = new TransportMessage<>(request.getContainer().getToken(), request, TransportMessageDirection.Request, () -> encoder.encode(request), subject);
message.setContinuous(true);
sendingQueue.add(message);
@@ -429,12 +390,14 @@ public abstract class TransporterBase implements ITransporter
{
XLog.i("Removing matching request token...");
pendingResponses.remove(token);
- } else if (response.getContainer().getCompleted())
+ }
+ else if (response.getContainer().getCompleted())
{
XLog.i("Response completed. Removing matching request token...");
pendingResponses.remove(token);
}
- } else
+ }
+ else
{
//This should never happen.
XLog.w("Matching request token was not found...");
@@ -442,7 +405,7 @@ public abstract class TransporterBase implements ITransporter
}
PublishSubject<Response> subject = PublishSubject.create();
- TransportMessage<Response> message = new TransportMessage<>(token, response, TransportMessageDirection.Response, onSerializingMessage(response), subject);
+ TransportMessage<Response> message = new TransportMessage<>(token, response, TransportMessageDirection.Response, () -> encoder.encode(response), subject);
sendingQueue.add(message);
return subject.singleOrError().toCompletable();
@@ -515,11 +478,13 @@ public abstract class TransporterBase implements ITransporter
if (message.getDirection() == TransportMessageDirection.Request)
{
pendingRequests.add(message);
- } else
+ }
+ else
{
message.setResult(new Object(), true);
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
message.setException(ex);
}
@@ -529,7 +494,8 @@ public abstract class TransporterBase implements ITransporter
SystemClock.sleep(10);
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
onFailed(ex);
}
@@ -564,8 +530,9 @@ public abstract class TransporterBase implements ITransporter
try
{
- container = onParseContainer(data);
- } catch (Exception e)
+ container = encoder.decodeContainer(data);
+ }
+ catch (Exception e)
{
XLog.e("Invalid message container received!", e);
continue;
@@ -589,18 +556,21 @@ public abstract class TransporterBase implements ITransporter
if (container.getError() == ErrorCode.NONE)
{
XLog.i("Response has returned with error: " + container.getError().toString());
- request.setResult(onParseTangoMessage(data), true);
- } else
+ request.setResult(encoder.decode(data), true);
+ }
+ else
{
XLog.i("Parsing inner response message and setting pending request task result...");
- request.setException(new ResponseErrorException(container.getError(), onParseTangoMessage(data)));
+ request.setException(new ResponseErrorException(container.getError(), (TangoMessage) encoder.decode(data)));
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
XLog.e("Error parsing inner message", ex);
request.setException(ex);
}
- } else
+ }
+ else
{
XLog.i("Pending request was identified as 'continuous response'. keeping pending request.");
@@ -613,19 +583,22 @@ public abstract class TransporterBase implements ITransporter
{
XLog.i("Continuous sequence completed.");
}
- request.setResult(onParseTangoMessage(data), container.getCompleted());
- } else
+ request.setResult(encoder.decode(data), container.getCompleted());
+ }
+ else
{
XLog.i("Response has returned with error: " + container.getError().toString());
- request.setException(new ResponseErrorException(container.getError(), onParseTangoMessage(data)));
+ request.setException(new ResponseErrorException(container.getError(), (TangoMessage) encoder.decode(data)));
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
XLog.e("Error parsing inner message", ex);
request.setException(ex);
}
}
- } else
+ }
+ else
{
XLog.i("Message was identified as a new request message: " + container.getType().toString());
@@ -643,12 +616,14 @@ public abstract class TransporterBase implements ITransporter
{
//ex.printStackTrace();
});
- } else
+ }
+ else
{
XLog.i("Invoking RequestReceived event...");
AsyncTask.execute(() -> onRequestReceived(container));
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
//Ignore any exception that might occur on the event handler side...
}
@@ -659,7 +634,8 @@ public abstract class TransporterBase implements ITransporter
SystemClock.sleep(10);
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
onFailed(ex);
}
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/encoders/ProtoEncoder.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/encoders/ProtoEncoder.java
index 113a677ae..47d8b906f 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/encoders/ProtoEncoder.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/encoders/ProtoEncoder.java
@@ -1,9 +1,32 @@
package com.twine.tango.transport.encoders;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.twine.tango.pmr.ITangoMessage;
+import com.twine.tango.pmr.MessageFactory;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+import com.twine.tango.transport.ITransportEncoder;
+
/**
- * Created by Roy on 1/3/2018.
+ * Represents a Transport message encoder capable of encoding or decoding {@link ITangoMessage}.
*/
-
-public class ProtoEncoder
+public class ProtoEncoder implements ITransportEncoder
{
+ @Override
+ public byte[] encode(ITangoMessage tangoMessage)
+ {
+ return tangoMessage.toBytes();
+ }
+
+ @Override
+ public ITangoMessage decode(byte[] data)
+ {
+ return MessageFactory.parseTangoMessage(data);
+ }
+
+ @Override
+ public MessageContainer decodeContainer(byte[] data) throws InvalidProtocolBufferException
+ {
+ MessageContainer container = MessageContainer.parseFrom(data);
+ return container;
+ }
}
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/BasicTransporter.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/BasicTransporter.java
index eeb9bfa08..aa6defd47 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/BasicTransporter.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/BasicTransporter.java
@@ -7,12 +7,12 @@ import com.twine.tango.transport.TransporterBase;
/**
* Represents an {@link com.twine.tango.transport.ITransporter} which communicates using protobuf protocol.
*/
-public class ProtoTransporter extends TransporterBase {
+public class BasicTransporter extends TransporterBase {
/**
* Instantiates a new Proto transporter.
*/
- public ProtoTransporter() {
+ public BasicTransporter() {
}
/**
@@ -20,7 +20,7 @@ public class ProtoTransporter extends TransporterBase {
*
* @param adapter the adapter
*/
- public ProtoTransporter(ITransportAdapter adapter) {
+ public BasicTransporter(ITransportAdapter adapter) {
super(adapter);
}
}