diff options
| author | Roy <roy.mail.net@gmail.com> | 2018-01-03 01:57:58 +0200 |
|---|---|---|
| committer | Roy <roy.mail.net@gmail.com> | 2018-01-03 01:57:58 +0200 |
| commit | 63b2a192ba12f8239668b6818db4ad02db68dbbc (patch) | |
| tree | c9c1de011b38fbff94ce87ac2771667b9a3e773d /Software/Android_Studio | |
| parent | f917366c405a4308b4b60e30eb1bd0dcf880532c (diff) | |
| download | Tango-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')
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); } } |
