From 827d096c0db3d9f6904519f7aa051e42c4d2a199 Mon Sep 17 00:00:00 2001 From: Aaron Date: Wed, 21 Feb 2018 09:08:48 -0800 Subject: [PATCH 1/9] Convert v1 responder to a common abstraction (in progress). --- .../dsa/dslink/protocol/message/MessageWriter.java | 4 ---- .../protocol/{protocol_v1 => v1}/CloseMessage.java | 2 +- .../{protocol_v1 => v1}/DS1ConnectionInit.java | 2 +- .../{protocol_v1 => v1}/DS1LinkConnection.java | 2 +- .../protocol/{protocol_v1 => v1}/DS1Session.java | 6 +++--- .../requester/DS1OutboundInvokeStub.java | 2 +- .../requester/DS1OutboundListStub.java | 2 +- .../requester/DS1OutboundRemoveStub.java | 2 +- .../requester/DS1OutboundSetStub.java | 2 +- .../requester/DS1OutboundStub.java | 2 +- .../requester/DS1OutboundSubscribeStub.java | 2 +- .../requester/DS1OutboundSubscribeStubs.java | 2 +- .../requester/DS1OutboundSubscriptions.java | 6 +++--- .../{protocol_v1 => v1}/requester/DS1Requester.java | 6 +++--- .../{protocol_v1 => v1}/responder/DS1Responder.java | 4 ++-- .../{protocol_v1 => v1}/responder/ErrorMessage.java | 2 +- .../protocol/{protocol_v2 => v2}/AckMessage.java | 2 +- .../protocol/{protocol_v2 => v2}/CloseMessage.java | 4 ++-- .../{protocol_v2 => v2}/DS2LinkConnection.java | 2 +- .../protocol/{protocol_v2 => v2}/DS2Message.java | 2 +- .../{protocol_v2 => v2}/DS2MessageReader.java | 2 +- .../{protocol_v2 => v2}/DS2MessageWriter.java | 2 +- .../protocol/{protocol_v2 => v2}/DS2Session.java | 13 +++++++------ .../{protocol_v2 => v2}/MessageConstants.java | 2 +- .../protocol/{protocol_v2 => v2}/PingMessage.java | 2 +- .../responder/DS2InboundInvoke.java | 6 +++--- .../responder/DS2InboundList.java | 6 +++--- .../responder/DS2InboundSet.java | 6 +++--- .../responder/DS2InboundSubscription.java | 6 +++--- .../responder/DS2InboundSubscriptions.java | 2 +- .../{protocol_v2 => v2}/responder/DS2Responder.java | 10 +++++----- .../{protocol_v2 => v2}/responder/ErrorMessage.java | 6 +++--- .../com/acuity/iot/dsa/dslink/test/TestLink.java | 6 +++--- .../src/main/java/org/iot/dsa/dslink/DSSysNode.java | 4 ++-- .../java/org/iot/dsa/dslink/V2HandshakeTest.java | 4 ++-- 35 files changed, 66 insertions(+), 69 deletions(-) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/CloseMessage.java (94%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/DS1ConnectionInit.java (99%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/DS1LinkConnection.java (99%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/DS1Session.java (98%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/requester/DS1OutboundInvokeStub.java (98%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/requester/DS1OutboundListStub.java (97%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/requester/DS1OutboundRemoveStub.java (96%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/requester/DS1OutboundSetStub.java (96%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/requester/DS1OutboundStub.java (97%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/requester/DS1OutboundSubscribeStub.java (97%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/requester/DS1OutboundSubscribeStubs.java (98%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/requester/DS1OutboundSubscriptions.java (97%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/requester/DS1Requester.java (96%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/responder/DS1Responder.java (98%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v1 => v1}/responder/ErrorMessage.java (97%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/AckMessage.java (92%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/CloseMessage.java (87%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/DS2LinkConnection.java (99%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/DS2Message.java (98%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/DS2MessageReader.java (99%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/DS2MessageWriter.java (99%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/DS2Session.java (95%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/MessageConstants.java (97%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/PingMessage.java (91%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/responder/DS2InboundInvoke.java (87%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/responder/DS2InboundList.java (94%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/responder/DS2InboundSet.java (75%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/responder/DS2InboundSubscription.java (91%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/responder/DS2InboundSubscriptions.java (96%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/responder/DS2Responder.java (95%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{protocol_v2 => v2}/responder/ErrorMessage.java (91%) diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/message/MessageWriter.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/message/MessageWriter.java index 63f413a9..e86ea71f 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/message/MessageWriter.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/message/MessageWriter.java @@ -3,10 +3,6 @@ import org.iot.dsa.io.DSIWriter; /** - * Used to read a DSA 2.n message (header and body). Call init(InputStream) to start a new message, - * can be reused for multiple messages. Not thread safe, the intent is messages will be constructed - * and read serially. - * * @author Aaron Hansen */ public interface MessageWriter { diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/CloseMessage.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/CloseMessage.java similarity index 94% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/CloseMessage.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/CloseMessage.java index ce7f77f1..b1c1eac2 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/CloseMessage.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/CloseMessage.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1; +package com.acuity.iot.dsa.dslink.protocol.v1; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/DS1ConnectionInit.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1ConnectionInit.java similarity index 99% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/DS1ConnectionInit.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1ConnectionInit.java index f6bf9d8f..fe1b302f 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/DS1ConnectionInit.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1ConnectionInit.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1; +package com.acuity.iot.dsa.dslink.protocol.v1; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/DS1LinkConnection.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1LinkConnection.java similarity index 99% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/DS1LinkConnection.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1LinkConnection.java index df4789a4..45df9340 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/DS1LinkConnection.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1LinkConnection.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1; +package com.acuity.iot.dsa.dslink.protocol.v1; import com.acuity.iot.dsa.dslink.transport.DSBinaryTransport; import com.acuity.iot.dsa.dslink.transport.DSTextTransport; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/DS1Session.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1Session.java similarity index 98% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/DS1Session.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1Session.java index 9e2bf088..5e46bfad 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/DS1Session.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1Session.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1; +package com.acuity.iot.dsa.dslink.protocol.v1; import static org.iot.dsa.io.DSIReader.Token.BEGIN_LIST; import static org.iot.dsa.io.DSIReader.Token.BEGIN_MAP; @@ -10,8 +10,8 @@ import com.acuity.iot.dsa.dslink.DSSession; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester.DS1Requester; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.responder.DS1Responder; +import com.acuity.iot.dsa.dslink.protocol.v1.requester.DS1Requester; +import com.acuity.iot.dsa.dslink.protocol.v1.responder.DS1Responder; import com.acuity.iot.dsa.dslink.transport.DSTransport; import java.io.IOException; import org.iot.dsa.dslink.DSIRequester; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundInvokeStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundInvokeStub.java similarity index 98% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundInvokeStub.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundInvokeStub.java index 86171954..162f04ac 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundInvokeStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundInvokeStub.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester; +package com.acuity.iot.dsa.dslink.protocol.v1.requester; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.requester.OutboundInvokeHandler; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundListStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundListStub.java similarity index 97% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundListStub.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundListStub.java index a18786bd..50b3d77a 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundListStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundListStub.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester; +package com.acuity.iot.dsa.dslink.protocol.v1.requester; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.DSRequestException; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundRemoveStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundRemoveStub.java similarity index 96% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundRemoveStub.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundRemoveStub.java index fa889c79..8250175a 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundRemoveStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundRemoveStub.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester; +package com.acuity.iot.dsa.dslink.protocol.v1.requester; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.requester.OutboundRequestHandler; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSetStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSetStub.java similarity index 96% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSetStub.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSetStub.java index c291c905..96b5a68d 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSetStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSetStub.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester; +package com.acuity.iot.dsa.dslink.protocol.v1.requester; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.requester.OutboundRequestHandler; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundStub.java similarity index 97% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundStub.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundStub.java index a047ef4f..7e231265 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundStub.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester; +package com.acuity.iot.dsa.dslink.protocol.v1.requester; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; import org.iot.dsa.dslink.requester.OutboundRequestHandler; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSubscribeStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStub.java similarity index 97% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSubscribeStub.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStub.java index a356c0ae..71ec8957 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSubscribeStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStub.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester; +package com.acuity.iot.dsa.dslink.protocol.v1.requester; import org.iot.dsa.dslink.requester.OutboundStream; import org.iot.dsa.dslink.requester.OutboundSubscribeHandler; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSubscribeStubs.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStubs.java similarity index 98% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSubscribeStubs.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStubs.java index d1d2b0b2..f3dc61f3 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSubscribeStubs.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStubs.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester; +package com.acuity.iot.dsa.dslink.protocol.v1.requester; import org.iot.dsa.node.DSElement; import org.iot.dsa.node.DSStatus; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSubscriptions.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscriptions.java similarity index 97% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSubscriptions.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscriptions.java index 7bf2eb44..41c5b242 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1OutboundSubscriptions.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscriptions.java @@ -1,9 +1,9 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester; +package com.acuity.iot.dsa.dslink.protocol.v1.requester; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.DS1Session; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester.DS1OutboundSubscribeStubs.State; +import com.acuity.iot.dsa.dslink.protocol.v1.DS1Session; +import com.acuity.iot.dsa.dslink.protocol.v1.requester.DS1OutboundSubscribeStubs.State; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1Requester.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java similarity index 96% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1Requester.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java index 0de3c72c..5c604419 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/requester/DS1Requester.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java @@ -1,8 +1,8 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester; +package com.acuity.iot.dsa.dslink.protocol.v1.requester; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.CloseMessage; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.DS1Session; +import com.acuity.iot.dsa.dslink.protocol.v1.CloseMessage; +import com.acuity.iot.dsa.dslink.protocol.v1.DS1Session; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/responder/DS1Responder.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/responder/DS1Responder.java similarity index 98% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/responder/DS1Responder.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/responder/DS1Responder.java index 31bd1a55..86b26f83 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/responder/DS1Responder.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/responder/DS1Responder.java @@ -1,9 +1,9 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.responder; +package com.acuity.iot.dsa.dslink.protocol.v1.responder; import com.acuity.iot.dsa.dslink.DSProtocolException; import com.acuity.iot.dsa.dslink.DSSession; import com.acuity.iot.dsa.dslink.protocol.DSStream; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.CloseMessage; +import com.acuity.iot.dsa.dslink.protocol.v1.CloseMessage; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundInvoke; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundList; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundRequest; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/responder/ErrorMessage.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/responder/ErrorMessage.java similarity index 97% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/responder/ErrorMessage.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/responder/ErrorMessage.java index 8b71f3bb..7d0256aa 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v1/responder/ErrorMessage.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/responder/ErrorMessage.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v1.responder; +package com.acuity.iot.dsa.dslink.protocol.v1.responder; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/AckMessage.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/AckMessage.java similarity index 92% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/AckMessage.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/AckMessage.java index 37498505..e1a7b730 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/AckMessage.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/AckMessage.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2; +package com.acuity.iot.dsa.dslink.protocol.v2; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/CloseMessage.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/CloseMessage.java similarity index 87% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/CloseMessage.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/CloseMessage.java index 7c0f169b..463daca2 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/CloseMessage.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/CloseMessage.java @@ -1,8 +1,8 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2; +package com.acuity.iot.dsa.dslink.protocol.v2; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.responder.DS2Responder; +import com.acuity.iot.dsa.dslink.protocol.v2.responder.DS2Responder; /** * Responder uses to close streams without errors. diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2LinkConnection.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2LinkConnection.java similarity index 99% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2LinkConnection.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2LinkConnection.java index 41e5a7b0..e93c0506 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2LinkConnection.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2LinkConnection.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2; +package com.acuity.iot.dsa.dslink.protocol.v2; import com.acuity.iot.dsa.dslink.io.DSByteBuffer; import com.acuity.iot.dsa.dslink.transport.DSBinaryTransport; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2Message.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2Message.java similarity index 98% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2Message.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2Message.java index da6df8ed..0520198b 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2Message.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2Message.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2; +package com.acuity.iot.dsa.dslink.protocol.v2; import org.iot.dsa.node.DSBytes; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2MessageReader.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2MessageReader.java similarity index 99% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2MessageReader.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2MessageReader.java index b5c2db8d..952b40c1 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2MessageReader.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2MessageReader.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2; +package com.acuity.iot.dsa.dslink.protocol.v2; import java.io.IOException; import java.io.InputStream; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2MessageWriter.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2MessageWriter.java similarity index 99% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2MessageWriter.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2MessageWriter.java index 451be7c2..eb451d5c 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2MessageWriter.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2MessageWriter.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2; +package com.acuity.iot.dsa.dslink.protocol.v2; import com.acuity.iot.dsa.dslink.io.DSByteBuffer; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2Session.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2Session.java similarity index 95% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2Session.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2Session.java index 4ecd6e00..958c4536 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/DS2Session.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/DS2Session.java @@ -1,9 +1,9 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2; +package com.acuity.iot.dsa.dslink.protocol.v2; import com.acuity.iot.dsa.dslink.DSSession; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.requester.DS1Requester; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.responder.DS2Responder; +import com.acuity.iot.dsa.dslink.protocol.v1.requester.DS1Requester; +import com.acuity.iot.dsa.dslink.protocol.v2.responder.DS2Responder; import com.acuity.iot.dsa.dslink.transport.DSBinaryTransport; import com.acuity.iot.dsa.dslink.transport.DSTransport; import org.iot.dsa.dslink.DSIRequester; @@ -41,7 +41,7 @@ public class DS2Session extends DSSession implements MessageConstants { private DS2MessageReader messageReader; private DS2MessageWriter messageWriter; private boolean requestsNext = false; - private DS1Requester requester;// = new DS1Requester(this); + private DSIRequester requester = null;//new DS2Requester(this); private DS2Responder responder = new DS2Responder(this); ///////////////////////////////////////////////////////////////// @@ -98,10 +98,11 @@ protected void doRecvMessage() { responder.handleRequest(reader); setNextAck(reader.getRequestId()); } else if (reader.isAck()) { - setNextAck(DSBytes.readInt(reader.getBody(), false)); + put(lastAckRecv, DSInt.valueOf(DSBytes.readInt(reader.getBody(), false))); } else if (reader.isPing()) { } else if (reader.isResponse()) { - ;//requester.processResponse(reader); + //requester.handleResponse(reader); + setNextAck(reader.getRequestId()); } if (debug) { debug(debugRecvMessage); diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/MessageConstants.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/MessageConstants.java similarity index 97% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/MessageConstants.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/MessageConstants.java index 1c666775..eb18434e 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/MessageConstants.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/MessageConstants.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2; +package com.acuity.iot.dsa.dslink.protocol.v2; /** * Used to write a DSA 2.n message (header and body). Call init(int,int) to start a new message, diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/PingMessage.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/PingMessage.java similarity index 91% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/PingMessage.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/PingMessage.java index 766039ea..e98d3b12 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/PingMessage.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/PingMessage.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2; +package com.acuity.iot.dsa.dslink.protocol.v2; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundInvoke.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundInvoke.java similarity index 87% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundInvoke.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundInvoke.java index e4566d6d..83094776 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundInvoke.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundInvoke.java @@ -1,8 +1,8 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2.responder; +package com.acuity.iot.dsa.dslink.protocol.v2.responder; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.DS2MessageWriter; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.MessageConstants; +import com.acuity.iot.dsa.dslink.protocol.v2.DS2MessageWriter; +import com.acuity.iot.dsa.dslink.protocol.v2.MessageConstants; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundInvoke; import com.acuity.iot.dsa.dslink.transport.DSBinaryTransport; import org.iot.dsa.node.DSMap; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundList.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundList.java similarity index 94% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundList.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundList.java index a28f6e97..1467fd63 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundList.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundList.java @@ -1,9 +1,9 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2.responder; +package com.acuity.iot.dsa.dslink.protocol.v2.responder; import com.acuity.iot.dsa.dslink.io.DSByteBuffer; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.DS2MessageWriter; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.MessageConstants; +import com.acuity.iot.dsa.dslink.protocol.v2.DS2MessageWriter; +import com.acuity.iot.dsa.dslink.protocol.v2.MessageConstants; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundList; import com.acuity.iot.dsa.dslink.transport.DSBinaryTransport; import org.iot.dsa.io.msgpack.MsgpackWriter; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundSet.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundSet.java similarity index 75% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundSet.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundSet.java index 3018cacb..790906df 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundSet.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundSet.java @@ -1,7 +1,7 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2.responder; +package com.acuity.iot.dsa.dslink.protocol.v2.responder; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.CloseMessage; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.MessageConstants; +import com.acuity.iot.dsa.dslink.protocol.v2.CloseMessage; +import com.acuity.iot.dsa.dslink.protocol.v2.MessageConstants; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundSet; import org.iot.dsa.node.DSElement; import org.iot.dsa.security.DSPermission; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundSubscription.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundSubscription.java similarity index 91% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundSubscription.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundSubscription.java index 76734d1c..99b5cb95 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundSubscription.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundSubscription.java @@ -1,9 +1,9 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2.responder; +package com.acuity.iot.dsa.dslink.protocol.v2.responder; import com.acuity.iot.dsa.dslink.io.DSByteBuffer; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.DS2MessageWriter; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.MessageConstants; +import com.acuity.iot.dsa.dslink.protocol.v2.DS2MessageWriter; +import com.acuity.iot.dsa.dslink.protocol.v2.MessageConstants; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundSubscription; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundSubscriptions; import com.acuity.iot.dsa.dslink.transport.DSBinaryTransport; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundSubscriptions.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundSubscriptions.java similarity index 96% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundSubscriptions.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundSubscriptions.java index 169f40f4..c16eae5b 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2InboundSubscriptions.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundSubscriptions.java @@ -1,4 +1,4 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2.responder; +package com.acuity.iot.dsa.dslink.protocol.v2.responder; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundSubscription; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2Responder.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2Responder.java similarity index 95% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2Responder.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2Responder.java index b462d966..5864efd4 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/DS2Responder.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2Responder.java @@ -1,10 +1,10 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2.responder; +package com.acuity.iot.dsa.dslink.protocol.v2.responder; import com.acuity.iot.dsa.dslink.protocol.DSStream; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.CloseMessage; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.DS2MessageReader; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.DS2Session; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.MessageConstants; +import com.acuity.iot.dsa.dslink.protocol.v2.CloseMessage; +import com.acuity.iot.dsa.dslink.protocol.v2.DS2MessageReader; +import com.acuity.iot.dsa.dslink.protocol.v2.DS2Session; +import com.acuity.iot.dsa.dslink.protocol.v2.MessageConstants; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundRequest; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundSet; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundSubscription; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/ErrorMessage.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/ErrorMessage.java similarity index 91% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/ErrorMessage.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/ErrorMessage.java index 7d7a228c..a6f0a088 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/protocol_v2/responder/ErrorMessage.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/ErrorMessage.java @@ -1,9 +1,9 @@ -package com.acuity.iot.dsa.dslink.protocol.protocol_v2.responder; +package com.acuity.iot.dsa.dslink.protocol.v2.responder; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.DS2MessageWriter; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.MessageConstants; +import com.acuity.iot.dsa.dslink.protocol.v2.DS2MessageWriter; +import com.acuity.iot.dsa.dslink.protocol.v2.MessageConstants; import com.acuity.iot.dsa.dslink.protocol.responder.DSInboundRequest; import com.acuity.iot.dsa.dslink.transport.DSBinaryTransport; import org.iot.dsa.dslink.DSInvalidPathException; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/test/TestLink.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/test/TestLink.java index a42ed398..da8dcf7c 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/test/TestLink.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/test/TestLink.java @@ -1,8 +1,8 @@ package com.acuity.iot.dsa.dslink.test; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.DS1ConnectionInit; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.DS1LinkConnection; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.DS1Session; +import com.acuity.iot.dsa.dslink.protocol.v1.DS1ConnectionInit; +import com.acuity.iot.dsa.dslink.protocol.v1.DS1LinkConnection; +import com.acuity.iot.dsa.dslink.protocol.v1.DS1Session; import com.acuity.iot.dsa.dslink.transport.DSTransport; import java.util.logging.Level; import org.iot.dsa.dslink.DSLink; diff --git a/dslink-core/src/main/java/org/iot/dsa/dslink/DSSysNode.java b/dslink-core/src/main/java/org/iot/dsa/dslink/DSSysNode.java index 876cbcc2..3120676c 100644 --- a/dslink-core/src/main/java/org/iot/dsa/dslink/DSSysNode.java +++ b/dslink-core/src/main/java/org/iot/dsa/dslink/DSSysNode.java @@ -1,7 +1,7 @@ package org.iot.dsa.dslink; -import com.acuity.iot.dsa.dslink.protocol.protocol_v1.DS1LinkConnection; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.DS2LinkConnection; +import com.acuity.iot.dsa.dslink.protocol.v1.DS1LinkConnection; +import com.acuity.iot.dsa.dslink.protocol.v2.DS2LinkConnection; import org.iot.dsa.node.DSInfo; import org.iot.dsa.node.DSNode; import org.iot.dsa.node.action.ActionInvocation; diff --git a/dslink-core/src/test/java/org/iot/dsa/dslink/V2HandshakeTest.java b/dslink-core/src/test/java/org/iot/dsa/dslink/V2HandshakeTest.java index be8d166c..1a02e85e 100644 --- a/dslink-core/src/test/java/org/iot/dsa/dslink/V2HandshakeTest.java +++ b/dslink-core/src/test/java/org/iot/dsa/dslink/V2HandshakeTest.java @@ -1,8 +1,8 @@ package org.iot.dsa.dslink; import com.acuity.iot.dsa.dslink.io.DSByteBuffer; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.DS2MessageReader; -import com.acuity.iot.dsa.dslink.protocol.protocol_v2.DS2MessageWriter; +import com.acuity.iot.dsa.dslink.protocol.v2.DS2MessageReader; +import com.acuity.iot.dsa.dslink.protocol.v2.DS2MessageWriter; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.security.KeyPair; From ebced270648d396c46722e5cb35d93c9a9465fe3 Mon Sep 17 00:00:00 2001 From: Aaron Date: Wed, 21 Feb 2018 09:10:07 -0800 Subject: [PATCH 2/9] Convert v1 *requester* to a common abstraction (in progress). --- .../protocol/message/MessageReader.java | 12 + .../requester/DSOutboundInvokeStub.java | 121 +++++++++ .../protocol/requester/DSOutboundStub.java | 105 ++++++++ .../requester/DSOutboundSubscribeStub.java | 102 +++++++ .../requester/DSOutboundSubscribeStubs.java | 190 +++++++++++++ .../requester/DSOutboundSubscriptions.java | 250 ++++++++++++++++++ .../protocol/requester/DSRequester.java | 133 ++++++++++ 7 files changed, 913 insertions(+) create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/message/MessageReader.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscribeStub.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscribeStubs.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscriptions.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/message/MessageReader.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/message/MessageReader.java new file mode 100644 index 00000000..bf46cb89 --- /dev/null +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/message/MessageReader.java @@ -0,0 +1,12 @@ +package com.acuity.iot.dsa.dslink.protocol.message; + +import org.iot.dsa.io.DSIReader; + +/** + * @author Aaron Hansen + */ +public interface MessageReader { + + public DSIReader getReader(); + +} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java new file mode 100644 index 00000000..b7dc171d --- /dev/null +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java @@ -0,0 +1,121 @@ +package com.acuity.iot.dsa.dslink.protocol.requester; + +import com.acuity.iot.dsa.dslink.protocol.message.MessageReader; +import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; +import org.iot.dsa.dslink.requester.OutboundInvokeHandler; +import org.iot.dsa.dslink.requester.OutboundInvokeHandler.Mode; +import org.iot.dsa.io.DSIWriter; +import org.iot.dsa.node.DSList; +import org.iot.dsa.node.DSMap; + +/** + * Manages the lifecycle of an invoke request and is also the outbound stream passed to the + * requester. + * + * @author Daniel Shapiro, Aaron Hansen + */ +public class DSOutboundInvokeStub extends DSOutboundStub { + + /////////////////////////////////////////////////////////////////////////// + // Fields + /////////////////////////////////////////////////////////////////////////// + + private OutboundInvokeHandler handler; + private DSMap params; + + /////////////////////////////////////////////////////////////////////////// + // Constructors + /////////////////////////////////////////////////////////////////////////// + + public DSOutboundInvokeStub(DSRequester requester, + Integer requestId, + String path, + DSMap params, + OutboundInvokeHandler handler) { + super(requester, requestId, path); + this.params = params; + this.handler = handler; + } + + /////////////////////////////////////////////////////////////////////////// + // Methods + /////////////////////////////////////////////////////////////////////////// + + @Override + public OutboundInvokeHandler getHandler() { + return handler; + } + + @Override + protected void handleResponse(MessageReader reader) { + DSMap response = reader.getReader().getMap(); + try { + DSList updates = response.getList("updates"); + DSMap meta = response.getMap("meta"); + if (meta != null) { + String mode = meta.getString("mode"); + if (mode != null) { + if ("refresh".equals(mode)) { + handler.onMode(Mode.REFRESH); + } else if ("append".equals(mode)) { + handler.onMode(Mode.APPEND); + } else if ("stream".equals(mode)) { + handler.onMode(Mode.STREAM); + } + } + meta = meta.getMap("meta"); + if ((meta != null) && (meta.size() > 0)) { + handler.onTableMeta(meta); + } + } + DSList columns = response.getList("columns"); + if (columns != null) { + handler.onColumns(columns); + } + if (meta != null) { + String modify = meta.get("modify", ""); + if (modify != null) { + String[] parts = toString().split(" "); + if (modify.startsWith("replace")) { + parts = parts[1].split("-"); + int start = Integer.parseInt(parts[0]); + int end = Integer.parseInt(parts[1]); + handler.onReplace(start, end, updates); + return; + } else if (modify.startsWith("insert")) { + int idx = Integer.parseInt(parts[1]); + handler.onInsert(idx, updates); + return; + } + } + } + if (updates == null) { + return; + } + for (int i = 0, len = updates.size(); i < len; i++) { + handler.onUpdate(updates.get(i).toList()); + } + } catch (Exception x) { + getRequester().error(getRequester().getPath(), x); + } + } + + /** + * Writes the v1 version by default. + */ + @Override + public void write(MessageWriter writer) { + DSIWriter out = writer.getWriter(); + out.beginMap(); + out.key("rid").value(getRequestId()); + out.key("method").value("invoke"); + out.key("permit").value("config"); + out.key("path").value(getPath()); + if (params == null) { + params = new DSMap(); + } + out.key("params").value(params); + out.endMap(); + } + +} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java new file mode 100644 index 00000000..05114c2f --- /dev/null +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java @@ -0,0 +1,105 @@ +package com.acuity.iot.dsa.dslink.protocol.requester; + +import com.acuity.iot.dsa.dslink.protocol.message.MessageReader; +import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; +import org.iot.dsa.dslink.requester.OutboundRequestHandler; +import org.iot.dsa.dslink.requester.OutboundStream; +import org.iot.dsa.node.DSElement; +import org.iot.dsa.node.DSMap; + +/** + * All stubs manage the lifecycle of a request and are also the outbound stream passed back to the + * requester. + * + * @author Daniel Shapiro, Aaron Hansen + */ +abstract class DSOutboundStub implements OutboundMessage, OutboundStream { + + /////////////////////////////////////////////////////////////////////////// + // Fields + /////////////////////////////////////////////////////////////////////////// + + private String path; + private boolean open = true; + private DSRequester requester; + private Integer requestId; + + /////////////////////////////////////////////////////////////////////////// + // Constructors + /////////////////////////////////////////////////////////////////////////// + + DSOutboundStub(DSRequester requester, Integer requestId, String path) { + this.requester = requester; + this.requestId = requestId; + this.path = path; + } + + /////////////////////////////////////////////////////////////////////////// + // Methods + /////////////////////////////////////////////////////////////////////////// + + @Override + public void closeStream() { + if (!open) { + return; + } + getRequester().sendClose(getRequestId()); + handleClose(); + } + + public abstract OutboundRequestHandler getHandler(); + + public String getPath() { + return path; + } + + public DSRequester getRequester() { + return requester; + } + + public Integer getRequestId() { + return requestId; + } + + protected void handleClose() { + if (!open) { + return; + } + open = false; + try { + getHandler().onClose(); + } catch (Exception x) { + getRequester().error(getRequester().getPath(), x); + } + getRequester().removeRequest(getRequestId()); + } + + protected void handleError(DSElement details) { + if (!open) { + return; + } + try { + String type = null; + String msg = null; + String detail = null; + if (details.isMap()) { + DSMap map = details.toMap(); + type = map.getString("type"); + msg = map.getString("msg"); + detail = map.getString("detail"); + } else { + msg = details.toString(); + } + getHandler().onError(type, msg, detail); + } catch (Exception x) { + getRequester().error(getRequester().getPath(), x); + } + } + + protected abstract void handleResponse(MessageReader reader); + + public boolean isStreamOpen() { + return open; + } + +} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscribeStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscribeStub.java new file mode 100644 index 00000000..7304b75f --- /dev/null +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscribeStub.java @@ -0,0 +1,102 @@ +package com.acuity.iot.dsa.dslink.protocol.requester; + +import org.iot.dsa.dslink.requester.OutboundStream; +import org.iot.dsa.dslink.requester.OutboundSubscribeHandler; +import org.iot.dsa.node.DSElement; +import org.iot.dsa.node.DSStatus; +import org.iot.dsa.time.DSDateTime; + +/** + * Manages the lifecycle of a single subscription and is also the outbound stream passed to the + * requester. + * + *

+ * + * There can be multiple subscriptions to a single path. They are all contained in a + * DSOutboundSubscribeStubs object. + * + * @author Daniel Shapiro, Aaron Hansen + */ +class DSOutboundSubscribeStub implements OutboundStream { + + /////////////////////////////////////////////////////////////////////////// + // Fields + /////////////////////////////////////////////////////////////////////////// + + private DSOutboundSubscribeStub next; //linked list in stubs object + private boolean open = true; + private String path; + private int qos = 0; + private OutboundSubscribeHandler request; + private DSOutboundSubscribeStubs stubs; + + /////////////////////////////////////////////////////////////////////////// + // Constructors + /////////////////////////////////////////////////////////////////////////// + + public DSOutboundSubscribeStub(String path, int qos, OutboundSubscribeHandler request) { + this.path = path; + this.qos = qos; + this.request = request; + } + + /////////////////////////////////////////////////////////////////////////// + // Methods + /////////////////////////////////////////////////////////////////////////// + + @Override + public void closeStream() { + synchronized (this) { + if (!open) { + return; + } + open = false; + } + stubs.remove(this); + try { + request.onClose(); + } catch (Exception x) { + stubs.getSubscriptions().error(path, x); + } + } + + public DSOutboundSubscribeStub getNext() { + return next; + } + + public String getPath() { + return path; + } + + public int getQos() { + return qos; + } + + @Override + public boolean isStreamOpen() { + return open; + } + + public void process(DSDateTime ts, DSElement value, DSStatus status) { + if (!open) { + return; + } + try { + request.onUpdate(ts, value, status); + } catch (Exception x) { + stubs.getSubscriptions().error(path, x); + } + } + + /** + * The next stub in the parents stubs object. + */ + void setNext(DSOutboundSubscribeStub next) { + this.next = next; + } + + void setStubs(DSOutboundSubscribeStubs stubs) { + this.stubs = stubs; + } + +} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscribeStubs.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscribeStubs.java new file mode 100644 index 00000000..1fa5343f --- /dev/null +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscribeStubs.java @@ -0,0 +1,190 @@ +package com.acuity.iot.dsa.dslink.protocol.requester; + +import org.iot.dsa.node.DSElement; +import org.iot.dsa.node.DSStatus; +import org.iot.dsa.time.DSDateTime; + +/** + * Contains one or more subscription stubs for the same path. + * + * @author Daniel Shapiro, Aaron Hansen + */ +class DSOutboundSubscribeStubs { + + /////////////////////////////////////////////////////////////////////////// + // Fields + /////////////////////////////////////////////////////////////////////////// + + private DSOutboundSubscribeStub first; + private DSOutboundSubscribeStub last; + private DSStatus lastStatus; + private DSDateTime lastTs; + private DSElement lastValue; + private String path; + private int qos = 0; + private Integer sid; + private int size; + private State state = State.PENDING_SUBSCRIBE; + private DSOutboundSubscriptions subscriptions; + + /////////////////////////////////////////////////////////////////////////// + // Constructors + /////////////////////////////////////////////////////////////////////////// + + public DSOutboundSubscribeStubs( + String path, + Integer sid, + DSOutboundSubscriptions subscriptions) { + this.path = path; + this.sid = sid; + this.subscriptions = subscriptions; + } + + /////////////////////////////////////////////////////////////////////////// + // Methods + /////////////////////////////////////////////////////////////////////////// + + /** + * If already subscribed, will pass the last update to the new subscriber. + */ + void add(DSOutboundSubscribeStub stub) { + if (stub.getQos() > qos) { + qos = stub.getQos(); + } + if (contains(stub)) { + return; + } + stub.setStubs(this); + if (last == null) { + first = stub; + last = stub; + } else { + last.setNext(stub); + last = stub; + } + //Send the last update to the new subscription + if (++size > 1) { + if (lastValue != null) { + try { + stub.process(lastTs, lastValue, lastStatus); + } catch (Exception x) { + subscriptions.error(path, x); + } + } + } + } + + public void close() { + //TODO who calls this and for what purpose + /* + DSOutboundSubscribeStub cur = first; + while (cur != null) { + cur.close(); + cur = cur.getNext(); + } + */ + } + + private boolean contains(DSOutboundSubscribeStub stub) { + if (stub == first) { + return true; + } + return predecessor(stub) != last; + } + + public String getPath() { + return path; + } + + public int getQos() { + return qos; + } + + public Integer getSid() { + return sid; + } + + public State getState() { + return state; + } + + public DSOutboundSubscriptions getSubscriptions() { + return subscriptions; + } + + /** + * Null if the arg is the first in the list, last if stub is not contained. + */ + private DSOutboundSubscribeStub predecessor(DSOutboundSubscribeStub stub) { + if (first == null) { + return null; + } + if (stub == first) { + return null; + } + DSOutboundSubscribeStub cur = first; + while (cur.getNext() != null) { + if (cur.getNext() == stub) { + return cur; + } + cur = cur.getNext(); + } + return cur; + } + + void process(DSDateTime ts, DSElement value, DSStatus status) { + DSOutboundSubscribeStub stub = first; + while (stub != null) { + try { + stub.process(ts, value, status); + } catch (Exception x) { + subscriptions.error(path, x); + } + stub = stub.getNext(); + } + lastTs = ts; + lastValue = value; + lastStatus = status; + } + + void remove(DSOutboundSubscribeStub stub) { + DSOutboundSubscribeStub pred = predecessor(stub); + if (pred == last) { //not contained + return; + } + if (stub == first) { + if (first == last) { + first = last = null; + } else { + first = first.getNext(); + } + } + if (stub == last) { + last = pred; + pred.setNext(null); + } + if (--size == 0) { + subscriptions.unsubscribe(this); + } + } + + void setState(State state) { + this.state = state; + } + + int size() { + return size; + } + + /////////////////////////////////////////////////////////////////////////// + // Inner Classes + /////////////////////////////////////////////////////////////////////////// + + public enum State { + PENDING_SUBSCRIBE, + PENDING_UNSUBSCRIBE, + SUBSCRIBED, + UNSUBSCRIBED + } + +} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscriptions.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscriptions.java new file mode 100644 index 00000000..9a8b7026 --- /dev/null +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscriptions.java @@ -0,0 +1,250 @@ +package com.acuity.iot.dsa.dslink.protocol.requester; + +import com.acuity.iot.dsa.dslink.DSSession; +import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; +import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; +import com.acuity.iot.dsa.dslink.protocol.requester.DSOutboundSubscribeStubs.State; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import org.iot.dsa.dslink.requester.OutboundSubscribeHandler; +import org.iot.dsa.io.DSIWriter; +import org.iot.dsa.logging.DSLogger; +import org.iot.dsa.node.DSElement; +import org.iot.dsa.node.DSList; +import org.iot.dsa.node.DSMap; +import org.iot.dsa.node.DSNull; +import org.iot.dsa.node.DSStatus; +import org.iot.dsa.time.DSDateTime; + +/** + * Manages all subscriptions for a requester. + * + * @author Aaron Hansen + */ +class DSOutboundSubscriptions extends DSLogger implements OutboundMessage { + + /////////////////////////////////////////////////////////////////////////// + // Constants + /////////////////////////////////////////////////////////////////////////// + + static final int MAX_SID = 2147483647; + + /////////////////////////////////////////////////////////////////////////// + // Fields + /////////////////////////////////////////////////////////////////////////// + + private boolean enqueued = false; + private int nextSid = 1; + private final ConcurrentLinkedQueue pendingSubscribe = + new ConcurrentLinkedQueue(); + private final ConcurrentLinkedQueue pendingUnsubscribe = + new ConcurrentLinkedQueue(); + private final Map pathMap = + new ConcurrentHashMap(); + private DSRequester requester; + private final Map sidMap = + new ConcurrentHashMap(); + + /////////////////////////////////////////////////////////////////////////// + // Constructors + /////////////////////////////////////////////////////////////////////////// + + DSOutboundSubscriptions(DSRequester requester) { + this.requester = requester; + } + + /////////////////////////////////////////////////////////////////////////// + // Methods in alphabetical order + /////////////////////////////////////////////////////////////////////////// + + /** + * This is already synchronized by the subscribe method. + */ + private int getNextSid() { + int ret = nextSid; + if (++nextSid > MAX_SID) { + nextSid = 1; + } + return ret; + } + + DSRequester getRequester() { + return requester; + } + + public void onConnect() { + } + + public void onConnectFail() { + } + + public void onDisconnect() { + } + + void processUpdate(DSElement updateElement) { + int sid = -1; + DSElement value; + String ts, sts = null; + if (updateElement instanceof DSList) { + DSList updateList = (DSList) updateElement; + int cols = updateList.size(); + if (cols < 3) { + trace(trace() ? "Update incomplete: " + updateList.toString() : null); + return; + } + sid = updateList.get(0, -1); + value = updateList.get(1); + ts = updateList.getString(2); + sts = updateList.get(3, (String) null); + } else if (updateElement instanceof DSMap) { + DSMap updateMap = (DSMap) updateElement; + sid = updateMap.get("sid", -1); + value = updateMap.get("value"); + ts = updateMap.getString("ts"); + sts = updateMap.get("status", (String) null); + } else { + return; + } + if (sid < 0) { + debug(debug() ? "Update missing sid: " + updateElement.toString() : null); + return; + } + DSOutboundSubscribeStubs stub = sidMap.get(sid); + if (stub == null) { + debug(debug() ? ("Unexpected subscription update sid=" + sid) : null); + return; + } + DSDateTime timestamp = null; + if (ts == null) { + timestamp = DSDateTime.currentTime(); + } else { + timestamp = DSDateTime.valueOf(ts); + } + DSStatus status = DSStatus.ok; + if (sts != null) { + status = DSStatus.valueOf(sts); + } + if (value == null) { + value = DSNull.NULL; + } + stub.process(timestamp, value, status); + } + + void processUpdates(DSMap map) { + DSList updates = map.getList("updates"); + for (int i = 0; i < updates.size(); i++) { + DSElement update = updates.get(i); + processUpdate(update); + } + } + + private void sendMessage() { + synchronized (this) { + if (enqueued) { + return; + } + enqueued = true; + } + requester.sendRequest(this); + } + + /** + * Create or update a subscription. + */ + OutboundSubscribeHandler subscribe(String path, int qos, OutboundSubscribeHandler req) { + DSOutboundSubscribeStub stub = new DSOutboundSubscribeStub(path, qos, req); + DSOutboundSubscribeStubs stubs = null; + synchronized (pathMap) { + stubs = pathMap.get(path); + if (stubs == null) { + stubs = new DSOutboundSubscribeStubs(path, getNextSid(), this); + stubs.add(stub); + pendingSubscribe.add(stubs); + pathMap.put(path, stubs); + sidMap.put(stubs.getSid(), stubs); + } else { + stubs.add(stub); + stubs.setState(State.PENDING_SUBSCRIBE); + pendingSubscribe.add(stubs); + } + } + try { + req.onInit(path, stubs.getQos(), stub); + } catch (Exception x) { + error(path, x); + } + sendMessage(); + return req; + } + + /** + * Remove the subscription and call onClose. + */ + void unsubscribe(DSOutboundSubscribeStubs stubs) { + synchronized (pathMap) { + if (stubs.size() == 0) { + stubs.setState(State.PENDING_UNSUBSCRIBE); + pendingUnsubscribe.add(stubs); + sendMessage(); + } + } + } + + @Override + public void write(MessageWriter writer) { + DSIWriter out = writer.getWriter(); + DSSession session = requester.getSession(); + if (!pendingSubscribe.isEmpty()) { + out.beginMap(); + out.key("rid").value(requester.getNextRid()); + out.key("method").value("subscribe"); + Iterator it = pendingSubscribe.iterator(); + out.key("paths").beginList(); + while (it.hasNext() && !session.shouldEndMessage()) { + DSOutboundSubscribeStubs stubs = it.next(); + if (stubs.getState() == State.PENDING_SUBSCRIBE) { + out.beginMap(); + out.key("path").value(stubs.getPath()); + out.key("sid").value(stubs.getSid()); + if (stubs.getQos() > 0) { + out.key("qos").value(stubs.getQos()); + } + stubs.setState(State.SUBSCRIBED); + out.endMap(); + } + it.remove(); + } + out.endList(); + out.endMap(); + } + if (!pendingUnsubscribe.isEmpty() && !session.shouldEndMessage()) { + out.beginMap(); + out.key("rid").value(requester.getNextRid()); + out.key("method").value("unsubscribe"); + out.key("sids").beginList(); + Iterator it = pendingUnsubscribe.iterator(); + while (it.hasNext() && !session.shouldEndMessage()) { + DSOutboundSubscribeStubs stubs = it.next(); + synchronized (pathMap) { + if (stubs.size() == 0) { + pathMap.remove(stubs.getPath()); + sidMap.remove(stubs.getSid()); + out.value(stubs.getSid()); + } + } + it.remove(); + } + out.endList(); + out.endMap(); + } + synchronized (this) { + enqueued = false; + } + if (!pendingSubscribe.isEmpty() || !pendingUnsubscribe.isEmpty()) { + sendMessage(); + } + } + +} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java new file mode 100644 index 00000000..e9316855 --- /dev/null +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java @@ -0,0 +1,133 @@ +package com.acuity.iot.dsa.dslink.protocol.requester; + +import com.acuity.iot.dsa.dslink.DSSession; +import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; +import com.acuity.iot.dsa.dslink.protocol.v1.CloseMessage; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import org.iot.dsa.dslink.DSIRequester; +import org.iot.dsa.dslink.requester.OutboundInvokeHandler; +import org.iot.dsa.dslink.requester.OutboundListHandler; +import org.iot.dsa.dslink.requester.OutboundRequestHandler; +import org.iot.dsa.dslink.requester.OutboundSubscribeHandler; +import org.iot.dsa.node.DSElement; +import org.iot.dsa.node.DSIValue; +import org.iot.dsa.node.DSMap; +import org.iot.dsa.node.DSNode; + +/** + * DSA requester abstraction. + * + * @author Daniel Shapiro, Aaron Hansen + */ +public class DSRequester extends DSNode implements DSIRequester { + + /////////////////////////////////////////////////////////////////////////// + // Fields + /////////////////////////////////////////////////////////////////////////// + + private final AtomicInteger nextRid = new AtomicInteger(); + private DSSession session; + private final Map requests = + new ConcurrentHashMap(); + private final DSOutboundSubscriptions subscriptions = + new DSOutboundSubscriptions(this); + + /////////////////////////////////////////////////////////////////////////// + // Constructors + /////////////////////////////////////////////////////////////////////////// + + public DSRequester(DSSession session) { + this.session = session; + } + + /////////////////////////////////////////////////////////////////////////// + // Methods + /////////////////////////////////////////////////////////////////////////// + + int getNextRid() { + return nextRid.incrementAndGet(); + } + + DSSession getSession() { + return session; + } + + @Override + public OutboundInvokeHandler invoke(String path, DSMap params, OutboundInvokeHandler req) { + /* + DS1OutboundInvokeStub stub = new DS1OutboundInvokeStub(this, getNextRid(), + path, params, req); + requests.put(stub.getRequestId(), stub); + req.onInit(path, params, stub); + session.enqueueOutgoingRequest(stub); + */ + return req; + } + + @Override + public OutboundListHandler list(String path, OutboundListHandler req) { + /* + DS1OutboundListStub stub = new DS1OutboundListStub(this, getNextRid(), path, req); + requests.put(stub.getRequestId(), stub); + req.onInit(path, stub); + session.enqueueOutgoingRequest(stub); + */ + return req; + } + + public void onConnect() { + subscriptions.onConnect(); + session.setRequesterAllowed(); + } + + public void onConnectFail() { + subscriptions.onConnectFail(); + } + + public void onDisconnect() { + subscriptions.onDisconnect(); + } + + @Override + public OutboundRequestHandler remove(String path, OutboundRequestHandler req) { + /* + DS1OutboundRemoveStub stub = new DS1OutboundRemoveStub(this, + getNextRid(), path, req); + requests.put(stub.getRequestId(), stub); + session.enqueueOutgoingRequest(stub); + */ + return req; + } + + void removeRequest(Integer rid) { + requests.remove(rid); + } + + void sendClose(Integer rid) { + requests.remove(rid); + sendRequest(new CloseMessage(rid, true)); + } + + void sendRequest(OutboundMessage res) { + session.enqueueOutgoingRequest(res); + } + + @Override + public OutboundRequestHandler set(String path, DSIValue value, OutboundRequestHandler req) { + /* + DS1OutboundSetStub stub = new DS1OutboundSetStub(this, getNextRid(), + path, value, req); + requests.put(stub.getRequestId(), stub); + session.enqueueOutgoingRequest(stub); + */ + return req; + } + + @Override + public OutboundSubscribeHandler subscribe(String path, int qos, OutboundSubscribeHandler req) { + return subscriptions.subscribe(path, qos, req); + } + +} From f4e4fd28d154f35737363e16968f1bae30ffeaa8 Mon Sep 17 00:00:00 2001 From: Aaron Date: Wed, 21 Feb 2018 12:07:32 -0800 Subject: [PATCH 3/9] Convert v1 *requester* to a common abstraction (in progress). --- .../requester/DSOutboundInvokeStub.java | 3 + .../DSOutboundListStub.java} | 22 +- .../DSOutboundRemoveStub.java} | 22 +- .../DSOutboundSetStub.java} | 24 +- .../protocol/requester/DSOutboundStub.java | 6 +- .../protocol/requester/DSRequester.java | 35 +-- .../dsa/dslink/protocol/v1/DS1Session.java | 2 +- .../v1/requester/DS1OutboundInvokeStub.java | 116 -------- .../v1/requester/DS1OutboundStub.java | 104 -------- .../requester/DS1OutboundSubscribeStub.java | 102 ------- .../requester/DS1OutboundSubscribeStubs.java | 190 ------------- .../requester/DS1OutboundSubscriptions.java | 250 ------------------ .../protocol/v1/requester/DS1Requester.java | 125 ++------- 13 files changed, 81 insertions(+), 920 deletions(-) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{v1/requester/DS1OutboundListStub.java => requester/DSOutboundListStub.java} (82%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{v1/requester/DS1OutboundRemoveStub.java => requester/DSOutboundRemoveStub.java} (71%) rename dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/{v1/requester/DS1OutboundSetStub.java => requester/DSOutboundSetStub.java} (72%) delete mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundInvokeStub.java delete mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundStub.java delete mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStub.java delete mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStubs.java delete mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscriptions.java diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java index b7dc171d..33b56e32 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java @@ -46,6 +46,9 @@ public OutboundInvokeHandler getHandler() { return handler; } + /** + * Writes the v1 response by default. V2 probably only needs to add some headers. + */ @Override protected void handleResponse(MessageReader reader) { DSMap response = reader.getReader().getMap(); diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundListStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundListStub.java similarity index 82% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundListStub.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundListStub.java index 50b3d77a..042b4705 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundListStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundListStub.java @@ -1,5 +1,6 @@ -package com.acuity.iot.dsa.dslink.protocol.v1.requester; +package com.acuity.iot.dsa.dslink.protocol.requester; +import com.acuity.iot.dsa.dslink.protocol.message.MessageReader; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.DSRequestException; import org.iot.dsa.dslink.requester.OutboundListHandler; @@ -14,7 +15,7 @@ * * @author Daniel Shapiro, Aaron Hansen */ -class DS1OutboundListStub extends DS1OutboundStub { +public class DSOutboundListStub extends DSOutboundStub { /////////////////////////////////////////////////////////////////////////// // Fields @@ -26,10 +27,10 @@ class DS1OutboundListStub extends DS1OutboundStub { // Constructors /////////////////////////////////////////////////////////////////////////// - public DS1OutboundListStub(DS1Requester requester, - Integer requestId, - String path, - OutboundListHandler request) { + public DSOutboundListStub(DSRequester requester, + Integer requestId, + String path, + OutboundListHandler request) { super(requester, requestId, path); this.request = request; } @@ -43,9 +44,13 @@ public OutboundListHandler getHandler() { return request; } + /** + * Reads the v1 response. + */ @Override - protected void handleResponse(DSMap response) { + protected void handleResponse(MessageReader reader) { try { + DSMap response = reader.getReader().getMap(); DSList updates = response.getList("updates"); if (updates != null) { String name; @@ -77,6 +82,9 @@ protected void handleResponse(DSMap response) { } } + /** + * Writes the v1 request. + */ @Override public void write(MessageWriter writer) { DSIWriter out = writer.getWriter(); diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundRemoveStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundRemoveStub.java similarity index 71% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundRemoveStub.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundRemoveStub.java index 8250175a..568de3ce 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundRemoveStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundRemoveStub.java @@ -1,9 +1,9 @@ -package com.acuity.iot.dsa.dslink.protocol.v1.requester; +package com.acuity.iot.dsa.dslink.protocol.requester; +import com.acuity.iot.dsa.dslink.protocol.message.MessageReader; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.requester.OutboundRequestHandler; import org.iot.dsa.io.DSIWriter; -import org.iot.dsa.node.DSMap; /** * Manages the lifecycle of a remove request and is also the outbound stream passed to the @@ -11,7 +11,7 @@ * * @author Daniel Shapiro, Aaron Hansen */ -class DS1OutboundRemoveStub extends DS1OutboundStub { +public class DSOutboundRemoveStub extends DSOutboundStub { /////////////////////////////////////////////////////////////////////////// // Fields @@ -23,10 +23,10 @@ class DS1OutboundRemoveStub extends DS1OutboundStub { // Constructors /////////////////////////////////////////////////////////////////////////// - public DS1OutboundRemoveStub(DS1Requester requester, - Integer requestId, - String path, - OutboundRequestHandler request) { + public DSOutboundRemoveStub(DSRequester requester, + Integer requestId, + String path, + OutboundRequestHandler request) { super(requester, requestId, path); this.request = request; } @@ -39,10 +39,16 @@ public OutboundRequestHandler getHandler() { return request; } + /** + * Does nothing. + */ @Override - protected void handleResponse(DSMap map) { + protected void handleResponse(MessageReader reader) { } + /** + * Writes the v1 version. + */ @Override public void write(MessageWriter writer) { DSIWriter out = writer.getWriter(); diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSetStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSetStub.java similarity index 72% rename from dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSetStub.java rename to dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSetStub.java index 96b5a68d..e051864c 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSetStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSetStub.java @@ -1,17 +1,17 @@ -package com.acuity.iot.dsa.dslink.protocol.v1.requester; +package com.acuity.iot.dsa.dslink.protocol.requester; +import com.acuity.iot.dsa.dslink.protocol.message.MessageReader; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.requester.OutboundRequestHandler; import org.iot.dsa.io.DSIWriter; import org.iot.dsa.node.DSIValue; -import org.iot.dsa.node.DSMap; /** * Manages the lifecycle of a set request and is also the outbound stream passed to the requester. * * @author Daniel Shapiro, Aaron Hansen */ -class DS1OutboundSetStub extends DS1OutboundStub { +public class DSOutboundSetStub extends DSOutboundStub { /////////////////////////////////////////////////////////////////////////// // Fields @@ -24,11 +24,11 @@ class DS1OutboundSetStub extends DS1OutboundStub { // Constructors /////////////////////////////////////////////////////////////////////////// - public DS1OutboundSetStub(DS1Requester requester, - Integer requestId, - String path, - DSIValue value, - OutboundRequestHandler request) { + public DSOutboundSetStub(DSRequester requester, + Integer requestId, + String path, + DSIValue value, + OutboundRequestHandler request) { super(requester, requestId, path); this.value = value; this.request = request; @@ -42,10 +42,16 @@ public OutboundRequestHandler getHandler() { return request; } + /** + * Does nothing, there is no response. + */ @Override - protected void handleResponse(DSMap map) { + protected void handleResponse(MessageReader reader) { } + /** + * Writes the v1 request. + */ @Override public void write(MessageWriter writer) { DSIWriter out = writer.getWriter(); diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java index 05114c2f..0471868a 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java @@ -13,7 +13,7 @@ * * @author Daniel Shapiro, Aaron Hansen */ -abstract class DSOutboundStub implements OutboundMessage, OutboundStream { +public abstract class DSOutboundStub implements OutboundMessage, OutboundStream { /////////////////////////////////////////////////////////////////////////// // Fields @@ -61,7 +61,7 @@ public Integer getRequestId() { return requestId; } - protected void handleClose() { + public void handleClose() { if (!open) { return; } @@ -74,7 +74,7 @@ protected void handleClose() { getRequester().removeRequest(getRequestId()); } - protected void handleError(DSElement details) { + public void handleError(DSElement details) { if (!open) { return; } diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java index e9316855..5cea7d47 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java @@ -2,7 +2,6 @@ import com.acuity.iot.dsa.dslink.DSSession; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; -import com.acuity.iot.dsa.dslink.protocol.v1.CloseMessage; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -11,7 +10,6 @@ import org.iot.dsa.dslink.requester.OutboundListHandler; import org.iot.dsa.dslink.requester.OutboundRequestHandler; import org.iot.dsa.dslink.requester.OutboundSubscribeHandler; -import org.iot.dsa.node.DSElement; import org.iot.dsa.node.DSIValue; import org.iot.dsa.node.DSMap; import org.iot.dsa.node.DSNode; @@ -21,7 +19,7 @@ * * @author Daniel Shapiro, Aaron Hansen */ -public class DSRequester extends DSNode implements DSIRequester { +public abstract class DSRequester extends DSNode implements DSIRequester { /////////////////////////////////////////////////////////////////////////// // Fields @@ -56,24 +54,20 @@ DSSession getSession() { @Override public OutboundInvokeHandler invoke(String path, DSMap params, OutboundInvokeHandler req) { - /* - DS1OutboundInvokeStub stub = new DS1OutboundInvokeStub(this, getNextRid(), - path, params, req); + DSOutboundInvokeStub stub = new DSOutboundInvokeStub(this, getNextRid(), + path, params, req); requests.put(stub.getRequestId(), stub); req.onInit(path, params, stub); session.enqueueOutgoingRequest(stub); - */ return req; } @Override public OutboundListHandler list(String path, OutboundListHandler req) { - /* - DS1OutboundListStub stub = new DS1OutboundListStub(this, getNextRid(), path, req); + DSOutboundListStub stub = new DSOutboundListStub(this, getNextRid(), path, req); requests.put(stub.getRequestId(), stub); req.onInit(path, stub); session.enqueueOutgoingRequest(stub); - */ return req; } @@ -92,36 +86,29 @@ public void onDisconnect() { @Override public OutboundRequestHandler remove(String path, OutboundRequestHandler req) { - /* - DS1OutboundRemoveStub stub = new DS1OutboundRemoveStub(this, - getNextRid(), path, req); + DSOutboundRemoveStub stub = new DSOutboundRemoveStub(this, + getNextRid(), path, req); requests.put(stub.getRequestId(), stub); session.enqueueOutgoingRequest(stub); - */ return req; } - void removeRequest(Integer rid) { + public void removeRequest(Integer rid) { requests.remove(rid); } - void sendClose(Integer rid) { - requests.remove(rid); - sendRequest(new CloseMessage(rid, true)); - } + protected abstract void sendClose(Integer rid); - void sendRequest(OutboundMessage res) { + public void sendRequest(OutboundMessage res) { session.enqueueOutgoingRequest(res); } @Override public OutboundRequestHandler set(String path, DSIValue value, OutboundRequestHandler req) { - /* - DS1OutboundSetStub stub = new DS1OutboundSetStub(this, getNextRid(), - path, value, req); + DSOutboundSetStub stub = new DSOutboundSetStub(this, getNextRid(), + path, value, req); requests.put(stub.getRequestId(), stub); session.enqueueOutgoingRequest(stub); - */ return req; } diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1Session.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1Session.java index 5e46bfad..2e55efcc 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1Session.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/DS1Session.java @@ -328,7 +328,7 @@ protected void processMessages(DSIReader reader, boolean areRequests) { if (areRequests) { responder.handleRequest(rid, req); } else { - requester.processResponse(rid, req); + requester.handleResponse(rid, req); } } diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundInvokeStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundInvokeStub.java deleted file mode 100644 index 162f04ac..00000000 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundInvokeStub.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.acuity.iot.dsa.dslink.protocol.v1.requester; - -import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; -import org.iot.dsa.dslink.requester.OutboundInvokeHandler; -import org.iot.dsa.dslink.requester.OutboundInvokeHandler.Mode; -import org.iot.dsa.io.DSIWriter; -import org.iot.dsa.node.DSList; -import org.iot.dsa.node.DSMap; - -/** - * Manages the lifecycle of an invoke request and is also the outbound stream passed to the - * requester. - * - * @author Daniel Shapiro, Aaron Hansen - */ -class DS1OutboundInvokeStub extends DS1OutboundStub { - - /////////////////////////////////////////////////////////////////////////// - // Fields - /////////////////////////////////////////////////////////////////////////// - - private OutboundInvokeHandler handler; - private DSMap params; - - /////////////////////////////////////////////////////////////////////////// - // Constructors - /////////////////////////////////////////////////////////////////////////// - - public DS1OutboundInvokeStub(DS1Requester requester, - Integer requestId, - String path, - DSMap params, - OutboundInvokeHandler handler) { - super(requester, requestId, path); - this.params = params; - this.handler = handler; - } - - /////////////////////////////////////////////////////////////////////////// - // Methods - /////////////////////////////////////////////////////////////////////////// - - @Override - public OutboundInvokeHandler getHandler() { - return handler; - } - - @Override - protected void handleResponse(DSMap response) { - try { - DSList updates = response.getList("updates"); - DSMap meta = response.getMap("meta"); - if (meta != null) { - String mode = meta.getString("mode"); - if (mode != null) { - if ("refresh".equals(mode)) { - handler.onMode(Mode.REFRESH); - } else if ("append".equals(mode)) { - handler.onMode(Mode.APPEND); - } else if ("stream".equals(mode)) { - handler.onMode(Mode.STREAM); - } - } - meta = meta.getMap("meta"); - if ((meta != null) && (meta.size() > 0)) { - handler.onTableMeta(meta); - } - } - DSList columns = response.getList("columns"); - if (columns != null) { - handler.onColumns(columns); - } - if (meta != null) { - String modify = meta.get("modify", ""); - if (modify != null) { - String[] parts = toString().split(" "); - if (modify.startsWith("replace")) { - parts = parts[1].split("-"); - int start = Integer.parseInt(parts[0]); - int end = Integer.parseInt(parts[1]); - handler.onReplace(start, end, updates); - return; - } else if (modify.startsWith("insert")) { - int idx = Integer.parseInt(parts[1]); - handler.onInsert(idx, updates); - return; - } - } - } - if (updates == null) { - return; - } - for (int i = 0, len = updates.size(); i < len; i++) { - handler.onUpdate(updates.get(i).toList()); - } - } catch (Exception x) { - getRequester().error(getRequester().getPath(), x); - } - } - - @Override - public void write(MessageWriter writer) { - DSIWriter out = writer.getWriter(); - out.beginMap(); - out.key("rid").value(getRequestId()); - out.key("method").value("invoke"); - out.key("permit").value("config"); - out.key("path").value(getPath()); - if (params == null) { - params = new DSMap(); - } - out.key("params").value(params); - out.endMap(); - } - -} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundStub.java deleted file mode 100644 index 7e231265..00000000 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundStub.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.acuity.iot.dsa.dslink.protocol.v1.requester; - -import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; -import org.iot.dsa.dslink.requester.OutboundRequestHandler; -import org.iot.dsa.dslink.requester.OutboundStream; -import org.iot.dsa.node.DSElement; -import org.iot.dsa.node.DSMap; - -/** - * All stubs manage the lifecycle of a request and are also the outbound stream passed back to the - * requester. - * - * @author Daniel Shapiro, Aaron Hansen - */ -abstract class DS1OutboundStub implements OutboundMessage, OutboundStream { - - /////////////////////////////////////////////////////////////////////////// - // Fields - /////////////////////////////////////////////////////////////////////////// - - private String path; - private boolean open = true; - private DS1Requester requester; - private Integer requestId; - - /////////////////////////////////////////////////////////////////////////// - // Constructors - /////////////////////////////////////////////////////////////////////////// - - DS1OutboundStub(DS1Requester requester, Integer requestId, String path) { - this.requester = requester; - this.requestId = requestId; - this.path = path; - } - - /////////////////////////////////////////////////////////////////////////// - // Methods - /////////////////////////////////////////////////////////////////////////// - - @Override - public void closeStream() { - if (!open) { - return; - } - getRequester().sendClose(getRequestId()); - handleClose(); - } - - public abstract OutboundRequestHandler getHandler(); - - public String getPath() { - return path; - } - - public DS1Requester getRequester() { - return requester; - } - - public Integer getRequestId() { - return requestId; - } - - protected void handleClose() { - if (!open) { - return; - } - open = false; - try { - getHandler().onClose(); - } catch (Exception x) { - getRequester().error(getRequester().getPath(), x); - } - getRequester().removeRequest(getRequestId()); - } - - protected void handleError(DSElement details) { - if (!open) { - return; - } - try { - String type = null; - String msg = null; - String detail = null; - if (details.isMap()) { - DSMap map = details.toMap(); - type = map.getString("type"); - msg = map.getString("msg"); - detail = map.getString("detail"); - } else { - msg = details.toString(); - } - getHandler().onError(type, msg, detail); - } catch (Exception x) { - getRequester().error(getRequester().getPath(), x); - } - } - - protected abstract void handleResponse(DSMap map); - - public boolean isStreamOpen() { - return open; - } - -} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStub.java deleted file mode 100644 index 71ec8957..00000000 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStub.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.acuity.iot.dsa.dslink.protocol.v1.requester; - -import org.iot.dsa.dslink.requester.OutboundStream; -import org.iot.dsa.dslink.requester.OutboundSubscribeHandler; -import org.iot.dsa.node.DSElement; -import org.iot.dsa.node.DSStatus; -import org.iot.dsa.time.DSDateTime; - -/** - * Manages the lifecycle of a single subscription and is also the outbound stream passed to the - * requester. - * - *

- * - * There can be multiple subscriptions to a single path. They are all contained in a - * DS1OutboundSubscribeStubs object. - * - * @author Daniel Shapiro, Aaron Hansen - */ -class DS1OutboundSubscribeStub implements OutboundStream { - - /////////////////////////////////////////////////////////////////////////// - // Fields - /////////////////////////////////////////////////////////////////////////// - - private DS1OutboundSubscribeStub next; //linked list in stubs object - private boolean open = true; - private String path; - private int qos = 0; - private OutboundSubscribeHandler request; - private DS1OutboundSubscribeStubs stubs; - - /////////////////////////////////////////////////////////////////////////// - // Constructors - /////////////////////////////////////////////////////////////////////////// - - public DS1OutboundSubscribeStub(String path, int qos, OutboundSubscribeHandler request) { - this.path = path; - this.qos = qos; - this.request = request; - } - - /////////////////////////////////////////////////////////////////////////// - // Methods - /////////////////////////////////////////////////////////////////////////// - - @Override - public void closeStream() { - synchronized (this) { - if (!open) { - return; - } - open = false; - } - stubs.remove(this); - try { - request.onClose(); - } catch (Exception x) { - stubs.getSubscriptions().error(path, x); - } - } - - public DS1OutboundSubscribeStub getNext() { - return next; - } - - public String getPath() { - return path; - } - - public int getQos() { - return qos; - } - - @Override - public boolean isStreamOpen() { - return open; - } - - public void process(DSDateTime ts, DSElement value, DSStatus status) { - if (!open) { - return; - } - try { - request.onUpdate(ts, value, status); - } catch (Exception x) { - stubs.getSubscriptions().error(path, x); - } - } - - /** - * The next stub in the parents stubs object. - */ - void setNext(DS1OutboundSubscribeStub next) { - this.next = next; - } - - void setStubs(DS1OutboundSubscribeStubs stubs) { - this.stubs = stubs; - } - -} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStubs.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStubs.java deleted file mode 100644 index f3dc61f3..00000000 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscribeStubs.java +++ /dev/null @@ -1,190 +0,0 @@ -package com.acuity.iot.dsa.dslink.protocol.v1.requester; - -import org.iot.dsa.node.DSElement; -import org.iot.dsa.node.DSStatus; -import org.iot.dsa.time.DSDateTime; - -/** - * Contains one or more subscription stubs for the same path. - * - * @author Daniel Shapiro, Aaron Hansen - */ -class DS1OutboundSubscribeStubs { - - /////////////////////////////////////////////////////////////////////////// - // Fields - /////////////////////////////////////////////////////////////////////////// - - private DS1OutboundSubscribeStub first; - private DS1OutboundSubscribeStub last; - private DSStatus lastStatus; - private DSDateTime lastTs; - private DSElement lastValue; - private String path; - private int qos = 0; - private Integer sid; - private int size; - private State state = State.PENDING_SUBSCRIBE; - private DS1OutboundSubscriptions subscriptions; - - /////////////////////////////////////////////////////////////////////////// - // Constructors - /////////////////////////////////////////////////////////////////////////// - - public DS1OutboundSubscribeStubs( - String path, - Integer sid, - DS1OutboundSubscriptions subscriptions) { - this.path = path; - this.sid = sid; - this.subscriptions = subscriptions; - } - - /////////////////////////////////////////////////////////////////////////// - // Methods - /////////////////////////////////////////////////////////////////////////// - - /** - * If already subscribed, will pass the last update to the new subscriber. - */ - void add(DS1OutboundSubscribeStub stub) { - if (stub.getQos() > qos) { - qos = stub.getQos(); - } - if (contains(stub)) { - return; - } - stub.setStubs(this); - if (last == null) { - first = stub; - last = stub; - } else { - last.setNext(stub); - last = stub; - } - //Send the last update to the new subscription - if (++size > 1) { - if (lastValue != null) { - try { - stub.process(lastTs, lastValue, lastStatus); - } catch (Exception x) { - subscriptions.error(path, x); - } - } - } - } - - public void close() { - //TODO who calls this and for what purpose - /* - DS1OutboundSubscribeStub cur = first; - while (cur != null) { - cur.close(); - cur = cur.getNext(); - } - */ - } - - private boolean contains(DS1OutboundSubscribeStub stub) { - if (stub == first) { - return true; - } - return predecessor(stub) != last; - } - - public String getPath() { - return path; - } - - public int getQos() { - return qos; - } - - public Integer getSid() { - return sid; - } - - public State getState() { - return state; - } - - public DS1OutboundSubscriptions getSubscriptions() { - return subscriptions; - } - - /** - * Null if the arg is the first in the list, last if stub is not contained. - */ - private DS1OutboundSubscribeStub predecessor(DS1OutboundSubscribeStub stub) { - if (first == null) { - return null; - } - if (stub == first) { - return null; - } - DS1OutboundSubscribeStub cur = first; - while (cur.getNext() != null) { - if (cur.getNext() == stub) { - return cur; - } - cur = cur.getNext(); - } - return cur; - } - - void process(DSDateTime ts, DSElement value, DSStatus status) { - DS1OutboundSubscribeStub stub = first; - while (stub != null) { - try { - stub.process(ts, value, status); - } catch (Exception x) { - subscriptions.error(path, x); - } - stub = stub.getNext(); - } - lastTs = ts; - lastValue = value; - lastStatus = status; - } - - void remove(DS1OutboundSubscribeStub stub) { - DS1OutboundSubscribeStub pred = predecessor(stub); - if (pred == last) { //not contained - return; - } - if (stub == first) { - if (first == last) { - first = last = null; - } else { - first = first.getNext(); - } - } - if (stub == last) { - last = pred; - pred.setNext(null); - } - if (--size == 0) { - subscriptions.unsubscribe(this); - } - } - - void setState(State state) { - this.state = state; - } - - int size() { - return size; - } - - /////////////////////////////////////////////////////////////////////////// - // Inner Classes - /////////////////////////////////////////////////////////////////////////// - - public enum State { - PENDING_SUBSCRIBE, - PENDING_UNSUBSCRIBE, - SUBSCRIBED, - UNSUBSCRIBED - } - -} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscriptions.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscriptions.java deleted file mode 100644 index 41c5b242..00000000 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1OutboundSubscriptions.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.acuity.iot.dsa.dslink.protocol.v1.requester; - -import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; -import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; -import com.acuity.iot.dsa.dslink.protocol.v1.DS1Session; -import com.acuity.iot.dsa.dslink.protocol.v1.requester.DS1OutboundSubscribeStubs.State; -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import org.iot.dsa.dslink.requester.OutboundSubscribeHandler; -import org.iot.dsa.io.DSIWriter; -import org.iot.dsa.logging.DSLogger; -import org.iot.dsa.node.DSElement; -import org.iot.dsa.node.DSList; -import org.iot.dsa.node.DSMap; -import org.iot.dsa.node.DSNull; -import org.iot.dsa.node.DSStatus; -import org.iot.dsa.time.DSDateTime; - -/** - * Manages all subscriptions for a requester. - * - * @author Aaron Hansen - */ -class DS1OutboundSubscriptions extends DSLogger implements OutboundMessage { - - /////////////////////////////////////////////////////////////////////////// - // Constants - /////////////////////////////////////////////////////////////////////////// - - static final int MAX_SID = 2147483647; - - /////////////////////////////////////////////////////////////////////////// - // Fields - /////////////////////////////////////////////////////////////////////////// - - private boolean enqueued = false; - private int nextSid = 1; - private final ConcurrentLinkedQueue pendingSubscribe = - new ConcurrentLinkedQueue(); - private final ConcurrentLinkedQueue pendingUnsubscribe = - new ConcurrentLinkedQueue(); - private final Map pathMap = - new ConcurrentHashMap(); - private DS1Requester requester; - private final Map sidMap = - new ConcurrentHashMap(); - - /////////////////////////////////////////////////////////////////////////// - // Constructors - /////////////////////////////////////////////////////////////////////////// - - DS1OutboundSubscriptions(DS1Requester requester) { - this.requester = requester; - } - - /////////////////////////////////////////////////////////////////////////// - // Methods in alphabetical order - /////////////////////////////////////////////////////////////////////////// - - /** - * This is already synchronized by the subscribe method. - */ - private int getNextSid() { - int ret = nextSid; - if (++nextSid > MAX_SID) { - nextSid = 1; - } - return ret; - } - - DS1Requester getRequester() { - return requester; - } - - public void onConnect() { - } - - public void onConnectFail() { - } - - public void onDisconnect() { - } - - void processUpdate(DSElement updateElement) { - int sid = -1; - DSElement value; - String ts, sts = null; - if (updateElement instanceof DSList) { - DSList updateList = (DSList) updateElement; - int cols = updateList.size(); - if (cols < 3) { - trace(trace() ? "Update incomplete: " + updateList.toString() : null); - return; - } - sid = updateList.get(0, -1); - value = updateList.get(1); - ts = updateList.getString(2); - sts = updateList.get(3, (String) null); - } else if (updateElement instanceof DSMap) { - DSMap updateMap = (DSMap) updateElement; - sid = updateMap.get("sid", -1); - value = updateMap.get("value"); - ts = updateMap.getString("ts"); - sts = updateMap.get("status", (String) null); - } else { - return; - } - if (sid < 0) { - debug(debug() ? "Update missing sid: " + updateElement.toString() : null); - return; - } - DS1OutboundSubscribeStubs stub = sidMap.get(sid); - if (stub == null) { - debug(debug() ? ("Unexpected subscription update sid=" + sid) : null); - return; - } - DSDateTime timestamp = null; - if (ts == null) { - timestamp = DSDateTime.currentTime(); - } else { - timestamp = DSDateTime.valueOf(ts); - } - DSStatus status = DSStatus.ok; - if (sts != null) { - status = DSStatus.valueOf(sts); - } - if (value == null) { - value = DSNull.NULL; - } - stub.process(timestamp, value, status); - } - - void processUpdates(DSMap map) { - DSList updates = map.getList("updates"); - for (int i = 0; i < updates.size(); i++) { - DSElement update = updates.get(i); - processUpdate(update); - } - } - - private void sendMessage() { - synchronized (this) { - if (enqueued) { - return; - } - enqueued = true; - } - requester.sendRequest(this); - } - - /** - * Create or update a subscription. - */ - OutboundSubscribeHandler subscribe(String path, int qos, OutboundSubscribeHandler req) { - DS1OutboundSubscribeStub stub = new DS1OutboundSubscribeStub(path, qos, req); - DS1OutboundSubscribeStubs stubs = null; - synchronized (pathMap) { - stubs = pathMap.get(path); - if (stubs == null) { - stubs = new DS1OutboundSubscribeStubs(path, getNextSid(), this); - stubs.add(stub); - pendingSubscribe.add(stubs); - pathMap.put(path, stubs); - sidMap.put(stubs.getSid(), stubs); - } else { - stubs.add(stub); - stubs.setState(State.PENDING_SUBSCRIBE); - pendingSubscribe.add(stubs); - } - } - try { - req.onInit(path, stubs.getQos(), stub); - } catch (Exception x) { - error(path, x); - } - sendMessage(); - return req; - } - - /** - * Remove the subscription and call onClose. - */ - void unsubscribe(DS1OutboundSubscribeStubs stubs) { - synchronized (pathMap) { - if (stubs.size() == 0) { - stubs.setState(State.PENDING_UNSUBSCRIBE); - pendingUnsubscribe.add(stubs); - sendMessage(); - } - } - } - - @Override - public void write(MessageWriter writer) { - DSIWriter out = writer.getWriter(); - DS1Session session = requester.getSession(); - if (!pendingSubscribe.isEmpty()) { - out.beginMap(); - out.key("rid").value(requester.getNextRid()); - out.key("method").value("subscribe"); - Iterator it = pendingSubscribe.iterator(); - out.key("paths").beginList(); - while (it.hasNext() && !session.shouldEndMessage()) { - DS1OutboundSubscribeStubs stubs = it.next(); - if (stubs.getState() == State.PENDING_SUBSCRIBE) { - out.beginMap(); - out.key("path").value(stubs.getPath()); - out.key("sid").value(stubs.getSid()); - if (stubs.getQos() > 0) { - out.key("qos").value(stubs.getQos()); - } - stubs.setState(State.SUBSCRIBED); - out.endMap(); - } - it.remove(); - } - out.endList(); - out.endMap(); - } - if (!pendingUnsubscribe.isEmpty() && !session.shouldEndMessage()) { - out.beginMap(); - out.key("rid").value(requester.getNextRid()); - out.key("method").value("unsubscribe"); - out.key("sids").beginList(); - Iterator it = pendingUnsubscribe.iterator(); - while (it.hasNext() && !session.shouldEndMessage()) { - DS1OutboundSubscribeStubs stubs = it.next(); - synchronized (pathMap) { - if (stubs.size() == 0) { - pathMap.remove(stubs.getPath()); - sidMap.remove(stubs.getSid()); - out.value(stubs.getSid()); - } - } - it.remove(); - } - out.endList(); - out.endMap(); - } - synchronized (this) { - enqueued = false; - } - if (!pendingSubscribe.isEmpty() || !pendingUnsubscribe.isEmpty()) { - sendMessage(); - } - } - -} diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java index 5c604419..f3437769 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java @@ -1,111 +1,43 @@ package com.acuity.iot.dsa.dslink.protocol.v1.requester; -import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; +import com.acuity.iot.dsa.dslink.protocol.requester.DSOutboundStub; +import com.acuity.iot.dsa.dslink.protocol.requester.DSRequester; import com.acuity.iot.dsa.dslink.protocol.v1.CloseMessage; import com.acuity.iot.dsa.dslink.protocol.v1.DS1Session; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; -import org.iot.dsa.dslink.DSIRequester; -import org.iot.dsa.dslink.requester.OutboundInvokeHandler; -import org.iot.dsa.dslink.requester.OutboundListHandler; -import org.iot.dsa.dslink.requester.OutboundRequestHandler; -import org.iot.dsa.dslink.requester.OutboundSubscribeHandler; import org.iot.dsa.node.DSElement; -import org.iot.dsa.node.DSIValue; import org.iot.dsa.node.DSMap; -import org.iot.dsa.node.DSNode; /** * DSA V1 requester implementation. * * @author Daniel Shapiro, Aaron Hansen */ -public class DS1Requester extends DSNode implements DSIRequester { +public class DS1Requester extends DSRequester { /////////////////////////////////////////////////////////////////////////// // Fields /////////////////////////////////////////////////////////////////////////// - private final AtomicInteger nextRid = new AtomicInteger(); - private DS1Session session; - private final Map requests = - new ConcurrentHashMap(); - private final DS1OutboundSubscriptions subscriptions = - new DS1OutboundSubscriptions(this); - /////////////////////////////////////////////////////////////////////////// // Constructors /////////////////////////////////////////////////////////////////////////// public DS1Requester(DS1Session session) { - this.session = session; + super(session); } /////////////////////////////////////////////////////////////////////////// // Methods /////////////////////////////////////////////////////////////////////////// - int getNextRid() { - return nextRid.incrementAndGet(); - } - - DS1Session getSession() { - return session; - } - - @Override - public OutboundInvokeHandler invoke(String path, DSMap params, OutboundInvokeHandler req) { - DS1OutboundInvokeStub stub = new DS1OutboundInvokeStub(this, getNextRid(), - path, params, req); - requests.put(stub.getRequestId(), stub); - req.onInit(path, params, stub); - session.enqueueOutgoingRequest(stub); - return req; - } - - boolean isError(DSMap message) { - DSElement e = message.get("error"); - if (e == null) { - return false; - } - return !e.isNull(); - } - - boolean isStreamClosed(DSMap message) { - return "closed".equals(message.getString("stream")); - } - - @Override - public OutboundListHandler list(String path, OutboundListHandler req) { - DS1OutboundListStub stub = new DS1OutboundListStub(this, getNextRid(), path, req); - requests.put(stub.getRequestId(), stub); - req.onInit(path, stub); - session.enqueueOutgoingRequest(stub); - return req; - } - - public void onConnect() { - subscriptions.onConnect(); - session.setRequesterAllowed(); - } - - public void onConnectFail() { - subscriptions.onConnectFail(); - } - - public void onDisconnect() { - subscriptions.onDisconnect(); - } - - /** + /** * Call by the parent session to handle response messages. */ - public void processResponse(Integer rid, DSMap map) { + public void handleResponse(Integer rid, DSMap map) { if (rid == 0) { - subscriptions.processUpdates(map); + processUpdates(map); } else { - DS1OutboundStub stub = requests.get(rid); + DSOutboundStub stub = requests.get(rid); if (stub != null) { stub.handleResponse(map); if (isError(map)) { @@ -113,7 +45,7 @@ public void processResponse(Integer rid, DSMap map) { } if (isStreamClosed(map)) { stub.handleClose(); - requests.remove(rid); + removeRequest(rid); } } else { if (!isStreamClosed(map)) { @@ -123,40 +55,21 @@ public void processResponse(Integer rid, DSMap map) { } } - @Override - public OutboundRequestHandler remove(String path, OutboundRequestHandler req) { - DS1OutboundRemoveStub stub = new DS1OutboundRemoveStub(this, - getNextRid(), path, req); - requests.put(stub.getRequestId(), stub); - session.enqueueOutgoingRequest(stub); - return req; + boolean isError(DSMap message) { + DSElement e = message.get("error"); + if (e == null) { + return false; + } + return !e.isNull(); } - void removeRequest(Integer rid) { - requests.remove(rid); + boolean isStreamClosed(DSMap message) { + return "closed".equals(message.getString("stream")); } - void sendClose(Integer rid) { - requests.remove(rid); + public void sendClose(Integer rid) { + removeRequest(rid); sendRequest(new CloseMessage(rid, true)); } - void sendRequest(OutboundMessage res) { - session.enqueueOutgoingRequest(res); - } - - @Override - public OutboundRequestHandler set(String path, DSIValue value, OutboundRequestHandler req) { - DS1OutboundSetStub stub = new DS1OutboundSetStub(this, getNextRid(), - path, value, req); - requests.put(stub.getRequestId(), stub); - session.enqueueOutgoingRequest(stub); - return req; - } - - @Override - public OutboundSubscribeHandler subscribe(String path, int qos, OutboundSubscribeHandler req) { - return subscriptions.subscribe(path, qos, req); - } - } From 6dad377ebdffc98897ae4a44cdcf11295f5b726f Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 22 Feb 2018 10:25:08 -0800 Subject: [PATCH 4/9] Convert v1 requester to a common abstraction. --- .../requester/DSOutboundInvokeStub.java | 14 ++--- .../requester/DSOutboundListStub.java | 15 +++-- .../requester/DSOutboundRemoveStub.java | 12 ++-- .../protocol/requester/DSOutboundSetStub.java | 14 ++--- .../protocol/requester/DSOutboundStub.java | 6 +- .../requester/DSOutboundSubscriptions.java | 43 ++------------- .../protocol/requester/DSRequester.java | 10 +++- .../protocol/responder/DSInboundInvoke.java | 6 +- .../protocol/responder/DSInboundList.java | 41 +++++++------- .../responder/DSInboundSubscriptions.java | 4 +- .../protocol/responder/DSResponder.java | 6 +- .../protocol/v1/requester/DS1Requester.java | 55 ++++++++++++++++--- .../protocol/v2/responder/DS2InboundList.java | 11 +++- .../main/java/org/iot/dsa/node/DSPath.java | 39 ++++++------- .../org/iot/dsa/dslink/test/MainNode.java | 9 ++- 15 files changed, 150 insertions(+), 135 deletions(-) diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java index 33b56e32..fdb2d565 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundInvokeStub.java @@ -1,6 +1,5 @@ package com.acuity.iot.dsa.dslink.protocol.requester; -import com.acuity.iot.dsa.dslink.protocol.message.MessageReader; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.requester.OutboundInvokeHandler; import org.iot.dsa.dslink.requester.OutboundInvokeHandler.Mode; @@ -27,11 +26,11 @@ public class DSOutboundInvokeStub extends DSOutboundStub { // Constructors /////////////////////////////////////////////////////////////////////////// - public DSOutboundInvokeStub(DSRequester requester, - Integer requestId, - String path, - DSMap params, - OutboundInvokeHandler handler) { + DSOutboundInvokeStub(DSRequester requester, + Integer requestId, + String path, + DSMap params, + OutboundInvokeHandler handler) { super(requester, requestId, path); this.params = params; this.handler = handler; @@ -50,8 +49,7 @@ public OutboundInvokeHandler getHandler() { * Writes the v1 response by default. V2 probably only needs to add some headers. */ @Override - protected void handleResponse(MessageReader reader) { - DSMap response = reader.getReader().getMap(); + public void handleResponse(DSMap response) { try { DSList updates = response.getList("updates"); DSMap meta = response.getMap("meta"); diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundListStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundListStub.java index 042b4705..e65f52f4 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundListStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundListStub.java @@ -1,6 +1,5 @@ package com.acuity.iot.dsa.dslink.protocol.requester; -import com.acuity.iot.dsa.dslink.protocol.message.MessageReader; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.DSRequestException; import org.iot.dsa.dslink.requester.OutboundListHandler; @@ -8,6 +7,7 @@ import org.iot.dsa.node.DSElement; import org.iot.dsa.node.DSList; import org.iot.dsa.node.DSMap; +import org.iot.dsa.node.DSPath; /** * Manages the lifecycle of an list request and is also the outbound stream passed to the @@ -27,10 +27,10 @@ public class DSOutboundListStub extends DSOutboundStub { // Constructors /////////////////////////////////////////////////////////////////////////// - public DSOutboundListStub(DSRequester requester, - Integer requestId, - String path, - OutboundListHandler request) { + DSOutboundListStub(DSRequester requester, + Integer requestId, + String path, + OutboundListHandler request) { super(requester, requestId, path); this.request = request; } @@ -48,9 +48,8 @@ public OutboundListHandler getHandler() { * Reads the v1 response. */ @Override - protected void handleResponse(MessageReader reader) { + public void handleResponse(DSMap response) { try { - DSMap response = reader.getReader().getMap(); DSList updates = response.getList("updates"); if (updates != null) { String name; @@ -60,7 +59,7 @@ protected void handleResponse(MessageReader reader) { if (elem.isList()) { list = (DSList) elem; name = list.getString(0); - request.onUpdate(name, list.get(1)); + request.onUpdate(DSPath.decodeName(name), list.get(1)); } else if (elem.isMap()) { map = (DSMap) elem; name = map.getString("name"); diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundRemoveStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundRemoveStub.java index 568de3ce..c6ff16d9 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundRemoveStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundRemoveStub.java @@ -1,9 +1,9 @@ package com.acuity.iot.dsa.dslink.protocol.requester; -import com.acuity.iot.dsa.dslink.protocol.message.MessageReader; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.requester.OutboundRequestHandler; import org.iot.dsa.io.DSIWriter; +import org.iot.dsa.node.DSMap; /** * Manages the lifecycle of a remove request and is also the outbound stream passed to the @@ -23,10 +23,10 @@ public class DSOutboundRemoveStub extends DSOutboundStub { // Constructors /////////////////////////////////////////////////////////////////////////// - public DSOutboundRemoveStub(DSRequester requester, - Integer requestId, - String path, - OutboundRequestHandler request) { + DSOutboundRemoveStub(DSRequester requester, + Integer requestId, + String path, + OutboundRequestHandler request) { super(requester, requestId, path); this.request = request; } @@ -43,7 +43,7 @@ public OutboundRequestHandler getHandler() { * Does nothing. */ @Override - protected void handleResponse(MessageReader reader) { + public void handleResponse(DSMap response) { } /** diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSetStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSetStub.java index e051864c..5e33e4e9 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSetStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSetStub.java @@ -1,10 +1,10 @@ package com.acuity.iot.dsa.dslink.protocol.requester; -import com.acuity.iot.dsa.dslink.protocol.message.MessageReader; import com.acuity.iot.dsa.dslink.protocol.message.MessageWriter; import org.iot.dsa.dslink.requester.OutboundRequestHandler; import org.iot.dsa.io.DSIWriter; import org.iot.dsa.node.DSIValue; +import org.iot.dsa.node.DSMap; /** * Manages the lifecycle of a set request and is also the outbound stream passed to the requester. @@ -24,11 +24,11 @@ public class DSOutboundSetStub extends DSOutboundStub { // Constructors /////////////////////////////////////////////////////////////////////////// - public DSOutboundSetStub(DSRequester requester, - Integer requestId, - String path, - DSIValue value, - OutboundRequestHandler request) { + DSOutboundSetStub(DSRequester requester, + Integer requestId, + String path, + DSIValue value, + OutboundRequestHandler request) { super(requester, requestId, path); this.value = value; this.request = request; @@ -46,7 +46,7 @@ public OutboundRequestHandler getHandler() { * Does nothing, there is no response. */ @Override - protected void handleResponse(MessageReader reader) { + public void handleResponse(DSMap response) { } /** diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java index 0471868a..b847feed 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundStub.java @@ -1,6 +1,5 @@ package com.acuity.iot.dsa.dslink.protocol.requester; -import com.acuity.iot.dsa.dslink.protocol.message.MessageReader; import com.acuity.iot.dsa.dslink.protocol.message.OutboundMessage; import org.iot.dsa.dslink.requester.OutboundRequestHandler; import org.iot.dsa.dslink.requester.OutboundStream; @@ -96,7 +95,10 @@ public void handleError(DSElement details) { } } - protected abstract void handleResponse(MessageReader reader); + /** + * Handle the V1 response map. + */ + public abstract void handleResponse(DSMap map); public boolean isStreamOpen() { return open; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscriptions.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscriptions.java index 9a8b7026..96390c24 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscriptions.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSOutboundSubscriptions.java @@ -12,8 +12,6 @@ import org.iot.dsa.io.DSIWriter; import org.iot.dsa.logging.DSLogger; import org.iot.dsa.node.DSElement; -import org.iot.dsa.node.DSList; -import org.iot.dsa.node.DSMap; import org.iot.dsa.node.DSNull; import org.iot.dsa.node.DSStatus; import org.iot.dsa.time.DSDateTime; @@ -23,7 +21,7 @@ * * @author Aaron Hansen */ -class DSOutboundSubscriptions extends DSLogger implements OutboundMessage { +public class DSOutboundSubscriptions extends DSLogger implements OutboundMessage { /////////////////////////////////////////////////////////////////////////// // Constants @@ -83,41 +81,18 @@ public void onConnectFail() { public void onDisconnect() { } - void processUpdate(DSElement updateElement) { - int sid = -1; - DSElement value; - String ts, sts = null; - if (updateElement instanceof DSList) { - DSList updateList = (DSList) updateElement; - int cols = updateList.size(); - if (cols < 3) { - trace(trace() ? "Update incomplete: " + updateList.toString() : null); - return; - } - sid = updateList.get(0, -1); - value = updateList.get(1); - ts = updateList.getString(2); - sts = updateList.get(3, (String) null); - } else if (updateElement instanceof DSMap) { - DSMap updateMap = (DSMap) updateElement; - sid = updateMap.get("sid", -1); - value = updateMap.get("value"); - ts = updateMap.getString("ts"); - sts = updateMap.get("status", (String) null); - } else { - return; - } + public void handleUpdate(int sid, String ts, String sts, DSElement value) { if (sid < 0) { - debug(debug() ? "Update missing sid: " + updateElement.toString() : null); + debug(debug() ? "Update missing sid" : null); return; } DSOutboundSubscribeStubs stub = sidMap.get(sid); if (stub == null) { - debug(debug() ? ("Unexpected subscription update sid=" + sid) : null); + debug(debug() ? ("Unexpected subscription sid " + sid) : null); return; } DSDateTime timestamp = null; - if (ts == null) { + if ((ts == null) || ts.isEmpty()) { timestamp = DSDateTime.currentTime(); } else { timestamp = DSDateTime.valueOf(ts); @@ -132,14 +107,6 @@ void processUpdate(DSElement updateElement) { stub.process(timestamp, value, status); } - void processUpdates(DSMap map) { - DSList updates = map.getList("updates"); - for (int i = 0; i < updates.size(); i++) { - DSElement update = updates.get(i); - processUpdate(update); - } - } - private void sendMessage() { synchronized (this) { if (enqueued) { diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java index 5cea7d47..75d98d1b 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/requester/DSRequester.java @@ -48,10 +48,18 @@ int getNextRid() { return nextRid.incrementAndGet(); } - DSSession getSession() { + protected DSOutboundStub getRequest(Integer rid) { + return requests.get(rid); + } + + protected DSSession getSession() { return session; } + protected DSOutboundSubscriptions getSubscriptions() { + return subscriptions; + } + @Override public OutboundInvokeHandler invoke(String path, DSMap params, OutboundInvokeHandler req) { DSOutboundInvokeStub stub = new DSOutboundInvokeStub(this, getNextRid(), diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundInvoke.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundInvoke.java index 38f55b65..c1218af9 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundInvoke.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundInvoke.java @@ -177,7 +177,7 @@ public DSPermission getPermission() { /** * Returns "updates" for v1. */ - protected String getRowsName() { + private String getRowsName() { return "updates"; } @@ -190,7 +190,7 @@ public boolean isClosed() { return state == STATE_CLOSED; } - public boolean isClosePending() { + private boolean isClosePending() { return state == STATE_CLOSE_PENDING; } @@ -288,8 +288,6 @@ public void write(MessageWriter writer) { case STATE_UPDATES: writeUpdates(writer); break; - default: - ; } if (isClosePending() && (updateHead == null)) { if (closeReason != null) { diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundList.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundList.java index 5f940c50..55fccdfe 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundList.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundList.java @@ -125,8 +125,7 @@ private synchronized Update dequeue() { if (updateHead == null) { return null; } - Update ret = null; - ret = updateHead; + Update ret = updateHead; if (updateHead == updateTail) { updateHead = null; updateTail = null; @@ -189,17 +188,17 @@ protected void endUpdates(MessageWriter writer) { /** * Override point for v2. */ - protected String encodeName(String name) { - cacheBuf.setLength(0); - if (DSPath.encodeNameV1(name, cacheBuf)) { - return cacheBuf.toString(); + protected String encodeName(String name, StringBuilder buf) { + buf.setLength(0); + if (DSPath.encodeNameV1(name, buf)) { + return buf.toString(); } return name; } protected void encodeChild(ApiObject child, MessageWriter writer) { String name = child.getName(); - String safe = encodeName(name); + String safe = encodeName(name, cacheBuf); DSMap map = new DSMap(); child.getMetadata(cacheMap.clear()); DSElement e = cacheMap.remove(DSMetadata.DISPLAY_NAME); @@ -267,7 +266,7 @@ private void encodeTarget(ApiObject object, MessageWriter writer) { } e = cacheMap.get("$name"); if (e == null) { - encode("$name", encodeName(object.getName()), writer); + encode("$name", object.getName(), writer); } else { encode("$name", e, writer); } @@ -314,7 +313,7 @@ private void encodeTargetAction(ApiObject object, MessageWriter writer) { DSMap param; while (params.hasNext()) { param = params.next(); - fixRange(param); + fixRangeTypes(param); if (dsAction != null) { dsAction.prepareParameter(info, param); } @@ -337,7 +336,7 @@ private void encodeTargetAction(ApiObject object, MessageWriter writer) { DSMap param; while (cols.hasNext()) { param = cols.next(); - fixRange(param); + fixRangeTypes(param); if (dsAction != null) { dsAction.prepareParameter(info, param); } @@ -374,9 +373,8 @@ private void encodeTargetMetadata(DSMap metadata, MessageWriter writer) { case '@': break; default: - cacheBuf.setLength(0); - cacheBuf.append("$"); - cacheBuf.append(encodeName(name)); + cacheBuf.append(encodeName(name, cacheBuf)); + cacheBuf.insert(0, '$'); name = cacheBuf.toString(); } @@ -417,7 +415,7 @@ private DSElement encodeType(DSIValue value, DSMetadata meta) { } } } - fixRange(meta.getMap()); + fixRangeTypes(meta.getMap()); DSElement e = cacheMap.remove(DSMetadata.TYPE); if (e == null) { throw new IllegalArgumentException("Missing type"); @@ -428,12 +426,12 @@ private DSElement encodeType(DSIValue value, DSMetadata meta) { /** * Override point for v2. */ - protected void encodeUpdate(Update update, MessageWriter writer) { + protected void encodeUpdate(Update update, MessageWriter writer, StringBuilder buf) { if (update.added) { encodeChild(update.child, writer); } else { writer.getWriter().beginMap() - .key("name").value(encodeName(update.child.getName())) + .key("name").value(encodeName(update.child.getName(), buf)) .key("change").value("remove") .endMap(); } @@ -472,14 +470,14 @@ private void enqueueResponse() { } /** - * Combines boolean and enum ranges into the type name. + * Properly formats boolean and enum ranges for v1 and v2. */ - private DSMap fixRange(DSMap arg) { + private void fixRangeTypes(DSMap arg) { String type = arg.getString(DSMetadata.TYPE); if ("bool".equals(type)) { DSList range = (DSList) arg.remove(DSMetadata.BOOLEAN_RANGE); if ((range == null) || (range.size() != 2)) { - return arg; + return; } else { cacheBuf.setLength(0); cacheBuf.append(type); @@ -497,7 +495,7 @@ private DSMap fixRange(DSMap arg) { } else if ("enum".equals(type) || "string".equals(type)) { DSList range = (DSList) arg.remove(DSMetadata.ENUM_RANGE); if (range == null) { - return arg; + return; } cacheBuf.setLength(0); cacheBuf.append("enum"); @@ -515,7 +513,6 @@ private DSMap fixRange(DSMap arg) { arg.put(DSMetadata.EDITOR, cacheBuf.toString()); } } - return arg; } @Override @@ -705,7 +702,7 @@ private void writeUpdates(MessageWriter writer) { if (update == null) { break; } - encodeUpdate(update, writer); + encodeUpdate(update, writer, cacheBuf); if (responder.shouldEndMessage()) { enqueueResponse(); break; diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundSubscriptions.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundSubscriptions.java index 6e567d02..55ecf37a 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundSubscriptions.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSInboundSubscriptions.java @@ -79,11 +79,11 @@ public DSResponder getResponder() { } /** - * This returns a DSInboundSubscription for v1, this will be overridden for v2. + * Returns a DSInboundSubscription for v1. * * @param sid Subscription ID. * @param path Path being subscribed to. - * @param qos Qualityf of service. + * @param qos Quality of service. */ protected DSInboundSubscription makeSubscription(Integer sid, String path, int qos) { return new DSInboundSubscription(this, sid, path, qos); diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSResponder.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSResponder.java index 836bd3f5..4377dfe7 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSResponder.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/responder/DSResponder.java @@ -17,10 +17,6 @@ */ public abstract class DSResponder extends DSNode { - /////////////////////////////////////////////////////////////////////////// - // Constants - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// // Fields /////////////////////////////////////////////////////////////////////////// @@ -90,7 +86,7 @@ public void onConnectFail() { public void onDisconnect() { } - public DSStream putRequest(Integer rid, DSStream request) { + protected DSStream putRequest(Integer rid, DSStream request) { return inboundRequests.put(rid, request); } diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java index f3437769..d7774cde 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v1/requester/DS1Requester.java @@ -5,6 +5,7 @@ import com.acuity.iot.dsa.dslink.protocol.v1.CloseMessage; import com.acuity.iot.dsa.dslink.protocol.v1.DS1Session; import org.iot.dsa.node.DSElement; +import org.iot.dsa.node.DSList; import org.iot.dsa.node.DSMap; /** @@ -14,10 +15,6 @@ */ public class DS1Requester extends DSRequester { - /////////////////////////////////////////////////////////////////////////// - // Fields - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// // Constructors /////////////////////////////////////////////////////////////////////////// @@ -30,14 +27,14 @@ public DS1Requester(DS1Session session) { // Methods /////////////////////////////////////////////////////////////////////////// - /** - * Call by the parent session to handle response messages. + /** + * Called by the parent session to handle response messages. */ public void handleResponse(Integer rid, DSMap map) { if (rid == 0) { processUpdates(map); } else { - DSOutboundStub stub = requests.get(rid); + DSOutboundStub stub = getRequest(rid); if (stub != null) { stub.handleResponse(map); if (isError(map)) { @@ -55,7 +52,7 @@ public void handleResponse(Integer rid, DSMap map) { } } - boolean isError(DSMap message) { + private boolean isError(DSMap message) { DSElement e = message.get("error"); if (e == null) { return false; @@ -63,10 +60,50 @@ boolean isError(DSMap message) { return !e.isNull(); } - boolean isStreamClosed(DSMap message) { + private boolean isStreamClosed(DSMap message) { return "closed".equals(message.getString("stream")); } + private void processUpdate(DSElement updateElement) { + int sid = -1; + DSElement value; + String ts, sts = null; + if (updateElement instanceof DSList) { + DSList updateList = (DSList) updateElement; + int cols = updateList.size(); + if (cols < 3) { + trace(trace() ? "Update incomplete: " + updateList.toString() : null); + return; + } + sid = updateList.get(0, -1); + value = updateList.get(1); + ts = updateList.getString(2); + sts = updateList.get(3, (String) null); + } else if (updateElement instanceof DSMap) { + DSMap updateMap = (DSMap) updateElement; + sid = updateMap.get("sid", -1); + value = updateMap.get("value"); + ts = updateMap.getString("ts"); + sts = updateMap.get("status", (String) null); + } else { + return; + } + if (sid < 0) { + debug(debug() ? "Update missing sid: " + updateElement.toString() : null); + return; + } + getSubscriptions().handleUpdate(sid, ts, sts, value); + } + + private void processUpdates(DSMap map) { + DSList updates = map.getList("updates"); + for (int i = 0; i < updates.size(); i++) { + DSElement update = updates.get(i); + processUpdate(update); + } + } + + @Override public void sendClose(Integer rid) { removeRequest(rid); sendRequest(new CloseMessage(rid, true)); diff --git a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundList.java b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundList.java index 1467fd63..6776b853 100644 --- a/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundList.java +++ b/dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/responder/DS2InboundList.java @@ -8,6 +8,7 @@ import com.acuity.iot.dsa.dslink.transport.DSBinaryTransport; import org.iot.dsa.io.msgpack.MsgpackWriter; import org.iot.dsa.node.DSElement; +import org.iot.dsa.node.DSPath; /** * List implementation for a responder. @@ -67,17 +68,21 @@ protected void encode(String key, String value, MessageWriter writer) { } @Override - protected String encodeName(String name) { + protected String encodeName(String name, StringBuilder buf) { + buf.setLength(0); + if (DSPath.encodeName(name, buf)) { + return buf.toString(); + } return name; } @Override - protected void encodeUpdate(Update update, MessageWriter writer) { + protected void encodeUpdate(Update update, MessageWriter writer, StringBuilder buf) { if (update.added) { encodeChild(update.child, writer); } else { DS2MessageWriter out = (DS2MessageWriter) writer; - out.writeString(encodeName(update.child.getName())); + out.writeString(encodeName(update.child.getName(), buf)); out.getBody().put((byte) 0, (byte) 0); } } diff --git a/dslink-core/src/main/java/org/iot/dsa/node/DSPath.java b/dslink-core/src/main/java/org/iot/dsa/node/DSPath.java index 4aa611d5..4f67d45d 100644 --- a/dslink-core/src/main/java/org/iot/dsa/node/DSPath.java +++ b/dslink-core/src/main/java/org/iot/dsa/node/DSPath.java @@ -40,7 +40,7 @@ public DSPath(String path) { /** * Un-escapes a name. */ - public static String decodePathName(String pathName) { + public static String decodeName(String pathName) { boolean modified = false; int len = pathName.length(); StringBuilder sb = new StringBuilder(len > 500 ? len / 2 : len); @@ -97,30 +97,31 @@ public static String[] decodePath(String path) { } String[] elems = splitPath(path); for (int i = 0, len = elems.length; i < len; i++) { - elems[i] = decodePathName(elems[i]); + elems[i] = decodeName(elems[i]); } return elems; } /** - * Ascends the tree and creates pretty printing path. - public static String encodeDisplayPath(DSNode node) { - ArrayList nodes = new ArrayList(); - while (node != null) { - if (node.getName() != null) { - nodes.add(node); - break; - } - node = node.getParent(); - } - StringBuilder builder = new StringBuilder(); - for (int i = nodes.size(); --i >= 0; ) { - builder.append('/'); - builder.append(node.getName()); - } - return builder.toString(); - } + * Creates a properly encoded path from the given names. + * + * @param leadingSlash Whether or not to prepend a slash to the path. + * @param names The names to encode in the given order. + * @return A properly encoded path name. */ + public static String encodePath(boolean leadingSlash, String... names) { + StringBuilder builder = new StringBuilder(); + if (leadingSlash) { + builder.append('/'); + } + for (int i = 0, len = names.length; i < len; i++) { + if (i > 0) { + builder.append('/'); + } + encodeName(names[i], builder); + } + return builder.toString(); + } /** * Ascends the tree and encodes all the node names into a path. diff --git a/dslink-java-v2-test/src/main/java/org/iot/dsa/dslink/test/MainNode.java b/dslink-java-v2-test/src/main/java/org/iot/dsa/dslink/test/MainNode.java index ec9c486c..e26168bc 100644 --- a/dslink-java-v2-test/src/main/java/org/iot/dsa/dslink/test/MainNode.java +++ b/dslink-java-v2-test/src/main/java/org/iot/dsa/dslink/test/MainNode.java @@ -66,7 +66,14 @@ protected void declareDefaults() { action.addValueResult("bool", DSBool.TRUE); action.addValueResult("long", DSLong.valueOf(0)); declareDefault("Values Action", action); - declareDefault("T./,<>?;:'\"[%]{/}bc", DSString.valueOf("abc")).setTransient(true); + //declareDefault("T./,;'<>?:\"[%]{/}bc", DSString.valueOf("abc")).setTransient(true); + //notice the missing chars from above, dglux gets funky with the chars: <>?:\" + declareDefault("T./,;'[%]{/}bc", DSString.valueOf("abc")).setTransient(true); + action = new DSAction(); + action.addParameter("Arg", + DSString.valueOf(""), + "My action description"); + declareDefault("Foo", action); } @Override From 3b5c87ae07bedb19950c07e2c7e41862b675adc7 Mon Sep 17 00:00:00 2001 From: Aaron Date: Wed, 28 Feb 2018 11:00:48 -0800 Subject: [PATCH 5/9] V2 Requester --- docs/javadoc/allclasses-frame.html | 4 +- docs/javadoc/allclasses-noframe.html | 4 +- docs/javadoc/constant-values.html | 108 ++++---- docs/javadoc/index-all.html | 78 +++--- .../org/iot/dsa/io/AbstractReader.html | 2 +- .../org/iot/dsa/io/AbstractWriter.html | 2 +- docs/javadoc/org/iot/dsa/io/DSIReader.html | 2 +- docs/javadoc/org/iot/dsa/io/DSIWriter.html | 2 +- .../org/iot/dsa/io/msgpack/MsgpackReader.html | 16 +- .../org/iot/dsa/io/msgpack/MsgpackWriter.html | 12 +- .../org/iot/dsa/io/msgpack/package-frame.html | 8 +- .../iot/dsa/io/msgpack/package-summary.html | 13 +- .../org/iot/dsa/io/msgpack/package-tree.html | 13 +- docs/javadoc/overview-frame.html | 2 +- docs/javadoc/overview-summary.html | 2 +- docs/javadoc/overview-tree.html | 6 +- .../iot/dsa/dslink/DSProtocolException.java | 51 ---- .../dslink}/io/msgpack/MsgpackConstants.java | 2 +- .../dsa/dslink}/io/msgpack/MsgpackReader.java | 16 +- .../dsa/dslink}/io/msgpack/MsgpackWriter.java | 2 +- .../protocol/message/ErrorResponse.java | 148 ----------- .../requester/DSOutboundInvokeStub.java | 15 +- .../requester/DSOutboundListStub.java | 8 +- .../requester/DSOutboundRemoveStub.java | 8 +- .../protocol/requester/DSOutboundSetStub.java | 14 +- .../protocol/requester/DSOutboundStub.java | 43 +++- .../protocol/requester/DSRequester.java | 61 ++++- .../protocol/responder/DSResponder.java | 1 - .../dslink/protocol/v1/DS1LinkConnection.java | 4 +- .../protocol/v1/requester/DS1Requester.java | 53 +++- .../dslink/protocol/v2/DS2MessageReader.java | 6 +- .../dslink/protocol/v2/DS2MessageWriter.java | 6 +- .../dsa/dslink/protocol/v2/DS2Session.java | 6 +- .../dslink/protocol/v2/MessageConstants.java | 28 +-- .../v2/requester/DS2OutboundInvokeStub.java | 43 ++++ .../v2/requester/DS2OutboundListStub.java | 76 ++++++ .../v2/requester/DS2OutboundRemoveStub.java | 20 ++ .../v2/requester/DS2OutboundSetStub.java | 51 ++++ .../v2/requester/DS2OutboundStub.java | 9 + .../protocol/v2/requester/DS2Requester.java | 235 ++++++++++++++++++ .../v2/responder/DS2InboundInvoke.java | 4 +- .../protocol/v2/responder/DS2InboundList.java | 8 +- .../protocol/v2/responder/DS2Responder.java | 16 +- .../src/main/java/org/iot/dsa/DSRuntime.java | 5 +- .../dsa/dslink/DSInternalErrorException.java | 17 ++ .../iot/dsa/dslink/DSPermissionException.java | 3 + .../dsa/dslink/DSUnsupportedException.java | 17 ++ .../iot/dsa/dslink/requester/ErrorType.java | 28 +++ .../requester/OutboundRequestHandler.java | 6 +- .../dslink/requester/SimpleInvokeHandler.java | 9 +- .../requester/SimpleRequestHandler.java | 2 +- .../main/java/org/iot/dsa/node/DSPath.java | 58 ++++- .../org/iot/dsa/dslink/DSElementTest.java | 28 ++- .../java/org/iot/dsa/dslink/DSPathTest.java | 27 ++ .../java/org/iot/dsa/dslink/MsgpackTest.java | 4 +- .../iot/dsa/dslink/RequesterInvokeTest.java | 2 +- .../dsa/dslink/RequesterSubscribeTest.java | 5 +- 57 files changed, 961 insertions(+), 458 deletions(-) rename dslink-core/src/main/java/{org/iot/dsa => com/acuity/iot/dsa/dslink}/io/msgpack/MsgpackConstants.java (95%) rename dslink-core/src/main/java/{org/iot/dsa => com/acuity/iot/dsa/dslink}/io/msgpack/MsgpackReader.java (96%) rename dslink-core/src/main/java/{org/iot/dsa => com/acuity/iot/dsa/dslink}/io/msgpack/MsgpackWriter.java (99%) delete mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/message/ErrorResponse.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/requester/DS2OutboundInvokeStub.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/requester/DS2OutboundListStub.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/requester/DS2OutboundRemoveStub.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/requester/DS2OutboundSetStub.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/requester/DS2OutboundStub.java create mode 100644 dslink-core/src/main/java/com/acuity/iot/dsa/dslink/protocol/v2/requester/DS2Requester.java create mode 100644 dslink-core/src/main/java/org/iot/dsa/dslink/DSInternalErrorException.java create mode 100644 dslink-core/src/main/java/org/iot/dsa/dslink/DSUnsupportedException.java create mode 100644 dslink-core/src/main/java/org/iot/dsa/dslink/requester/ErrorType.java create mode 100644 dslink-core/src/test/java/org/iot/dsa/dslink/DSPathTest.java diff --git a/docs/javadoc/allclasses-frame.html b/docs/javadoc/allclasses-frame.html index 919f06ca..f2eee610 100644 --- a/docs/javadoc/allclasses-frame.html +++ b/docs/javadoc/allclasses-frame.html @@ -109,8 +109,8 @@

All Classes

  • JsonConstants
  • JsonReader
  • JsonWriter
  • -
  • MsgpackReader
  • -
  • MsgpackWriter
  • +
  • MsgpackReader
  • +
  • MsgpackWriter
  • NodeDecoder
  • NodeEncoder
  • OutboundInvokeHandler
  • diff --git a/docs/javadoc/allclasses-noframe.html b/docs/javadoc/allclasses-noframe.html index de94e4cb..60392c32 100644 --- a/docs/javadoc/allclasses-noframe.html +++ b/docs/javadoc/allclasses-noframe.html @@ -109,8 +109,8 @@

    All Classes

  • JsonConstants
  • JsonReader
  • JsonWriter
  • -
  • MsgpackReader
  • -
  • MsgpackWriter
  • +
  • MsgpackReader
  • +
  • MsgpackWriter
  • NodeDecoder
  • NodeEncoder
  • OutboundInvokeHandler
  • diff --git a/docs/javadoc/constant-values.html b/docs/javadoc/constant-values.html index 4d4cd464..5870eb42 100644 --- a/docs/javadoc/constant-values.html +++ b/docs/javadoc/constant-values.html @@ -201,7 +201,7 @@

    org.iot.*