Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Read Response with timestamped SenML #1610

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
da719eb
Improvement of Read Response with timestamped SenML
mgdlkundera Apr 26, 2024
bdc09b7
Enhance lockstep comments
sbernard31 May 3, 2024
db9785f
Use single node serialization instead of multi node one.
sbernard31 May 3, 2024
e484e04
Check that result equal expected one.
sbernard31 May 3, 2024
c76b633
Add timestamped node to ReadResponse ToString()
sbernard31 May 3, 2024
1c48b9b
get content format from response not request
sbernard31 May 3, 2024
309e734
harmonize decodeCoapResponse method
sbernard31 May 3, 2024
5297297
In LockstepEndpoint really set content format
sbernard31 May 3, 2024
953e7b1
LockstepEP is Californium class must not refer to Leshan ContentFormat
sbernard31 May 3, 2024
33b9be3
Remove useless code
sbernard31 May 3, 2024
8c74153
Clean ReadResponse Constructor
sbernard31 May 3, 2024
0f4b65e
Check that we can only 1 timestamped value.
sbernard31 May 3, 2024
fa70fdf
Clean code by avoiding duplication
sbernard31 May 3, 2024
865a7b0
Implementation of timestamped value for Observe Response
mgdlkundera May 15, 2024
da22ae6
Use shorter timestamp (1s seems enough)
sbernard31 May 15, 2024
1213dc2
Add 1 param to observeResponse and add some javadoc
sbernard31 May 15, 2024
33dfd06
Add some javadoc to read response
sbernard31 May 15, 2024
f9dbd93
Fix response builder (response is created without given Observation)
sbernard31 May 16, 2024
b38a618
Go back to return 1 timestamped node
sbernard31 May 16, 2024
c9d91c7
Observe Response should have an "observe" option
sbernard31 May 16, 2024
69ff031
Add tests about Active Cancel Observe
sbernard31 May 16, 2024
9a1fee0
Add Timestamp support to Active Cancel Observe.
sbernard31 May 16, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ public ErrorResponseCreator(ResponseCode code, String errorMessage) {

@Override
public void visit(ReadRequest request) {
response = new ReadResponse(code, null, errorMessage);
response = new ReadResponse(code, null, null, errorMessage);
}

@Override
Expand Down Expand Up @@ -351,13 +351,13 @@ public void visit(DeleteRequest request) {

@Override
public void visit(ObserveRequest request) {
response = new ObserveResponse(code, null, null, null, errorMessage);
response = new ObserveResponse(code, null, null, null, null, errorMessage);
}

@Override
public void visit(CancelObservationRequest request) {
// TODO TL :we should check if this is really handle
response = new CancelObservationResponse(code, null, null, null, errorMessage);
response = new CancelObservationResponse(code, null, null, null, null, errorMessage);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,23 +246,23 @@ public ExecuteResponse execute(LwM2mServer server, int resourceid, Arguments arg
public ObserveResponse observe(LwM2mServer server) {
// Perform a read by default
ReadResponse readResponse = this.read(server);
return new ObserveResponse(readResponse.getCode(), readResponse.getContent(), null, null,
return new ObserveResponse(readResponse.getCode(), readResponse.getContent(), null, null, null,
readResponse.getErrorMessage());
}

@Override
public ObserveResponse observe(LwM2mServer server, int resourceid) {
// Perform a read by default
ReadResponse readResponse = this.read(server, resourceid);
return new ObserveResponse(readResponse.getCode(), readResponse.getContent(), null, null,
return new ObserveResponse(readResponse.getCode(), readResponse.getContent(), null, null, null,
readResponse.getErrorMessage());
}

@Override
public ObserveResponse observe(LwM2mServer server, int resourceid, int resourceInstanceId) {
// Perform a read by default
ReadResponse readResponse = this.read(server, resourceid, resourceInstanceId);
return new ObserveResponse(readResponse.getCode(), readResponse.getContent(), null, null,
return new ObserveResponse(readResponse.getCode(), readResponse.getContent(), null, null, null,
readResponse.getErrorMessage());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ public synchronized ObserveResponse observe(LwM2mServer server, ObserveRequest r

protected ObserveResponse doObserve(LwM2mServer server, ObserveRequest request) {
ReadResponse readResponse = this.read(server, new ReadRequest(request.getPath().toString()));
return new ObserveResponse(readResponse.getCode(), readResponse.getContent(), null, null,
return new ObserveResponse(readResponse.getCode(), readResponse.getContent(), null, null, null,
readResponse.getErrorMessage());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,15 @@

public class CancelObservationResponse extends ObserveResponse {

public CancelObservationResponse(ResponseCode code, LwM2mNode content, List<TimestampedLwM2mNode> timestampedValues,
SingleObservation observation, String errorMessage) {
super(code, content, timestampedValues, observation, errorMessage);
public CancelObservationResponse(ResponseCode code, LwM2mNode content, TimestampedLwM2mNode timestampedContent,
List<TimestampedLwM2mNode> timestampedValues, SingleObservation observation, String errorMessage) {
super(code, content, timestampedContent, timestampedValues, observation, errorMessage);
}

public CancelObservationResponse(ResponseCode code, LwM2mNode content, List<TimestampedLwM2mNode> timestampedValues,
SingleObservation observation, String errorMessage, Object coapResponse) {
super(code, content, timestampedValues, observation, errorMessage, coapResponse);
public CancelObservationResponse(ResponseCode code, LwM2mNode content, TimestampedLwM2mNode timestampedContent,
List<TimestampedLwM2mNode> timestampedValues, SingleObservation observation, String errorMessage,
Object coapResponse) {
super(code, content, timestampedContent, timestampedValues, observation, errorMessage, coapResponse);
}

@Override
Expand All @@ -50,34 +51,38 @@ else if (timestampedValues != null)
// Syntactic sugar static constructors :

public static CancelObservationResponse success(LwM2mNode content) {
return new CancelObservationResponse(ResponseCode.CONTENT, content, null, null, null);
return new CancelObservationResponse(ResponseCode.CONTENT, content, null, null, null, null);
}

public static CancelObservationResponse success(TimestampedLwM2mNode content) {
return new CancelObservationResponse(ResponseCode.CONTENT, null, content, null, null, null);
}

public static CancelObservationResponse success(List<TimestampedLwM2mNode> timestampedValues) {
return new CancelObservationResponse(ResponseCode.CONTENT, null, timestampedValues, null, null);
return new CancelObservationResponse(ResponseCode.CONTENT, null, null, timestampedValues, null, null);
}

public static CancelObservationResponse badRequest(String errorMessage) {
return new CancelObservationResponse(ResponseCode.BAD_REQUEST, null, null, null, errorMessage);
return new CancelObservationResponse(ResponseCode.BAD_REQUEST, null, null, null, null, errorMessage);
}

public static CancelObservationResponse notFound() {
return new CancelObservationResponse(ResponseCode.NOT_FOUND, null, null, null, null);
return new CancelObservationResponse(ResponseCode.NOT_FOUND, null, null, null, null, null);
}

public static CancelObservationResponse unauthorized() {
return new CancelObservationResponse(ResponseCode.UNAUTHORIZED, null, null, null, null);
return new CancelObservationResponse(ResponseCode.UNAUTHORIZED, null, null, null, null, null);
}

public static CancelObservationResponse methodNotAllowed() {
return new CancelObservationResponse(ResponseCode.METHOD_NOT_ALLOWED, null, null, null, null);
return new CancelObservationResponse(ResponseCode.METHOD_NOT_ALLOWED, null, null, null, null, null);
}

public static CancelObservationResponse notAcceptable() {
return new CancelObservationResponse(ResponseCode.NOT_ACCEPTABLE, null, null, null, null);
return new CancelObservationResponse(ResponseCode.NOT_ACCEPTABLE, null, null, null, null, null);
}

public static CancelObservationResponse internalServerError(String errorMessage) {
return new CancelObservationResponse(ResponseCode.INTERNAL_SERVER_ERROR, null, null, null, errorMessage);
return new CancelObservationResponse(ResponseCode.INTERNAL_SERVER_ERROR, null, null, null, null, errorMessage);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import java.util.List;

import org.eclipse.leshan.core.ResponseCode;
import org.eclipse.leshan.core.node.LwM2mChildNode;
import org.eclipse.leshan.core.node.LwM2mNode;
import org.eclipse.leshan.core.node.TimestampedLwM2mNode;
import org.eclipse.leshan.core.observation.SingleObservation;
Expand All @@ -33,27 +34,69 @@ public class ObserveResponse extends ReadResponse {
protected final SingleObservation observation;
protected final List<TimestampedLwM2mNode> timestampedValues;

public ObserveResponse(ResponseCode code, LwM2mNode content, List<TimestampedLwM2mNode> timestampedValues,
SingleObservation observation, String errorMessage) {
this(code, content, timestampedValues, observation, errorMessage, null);
public ObserveResponse(ResponseCode code, LwM2mNode content, TimestampedLwM2mNode timestampedContent,
List<TimestampedLwM2mNode> timestampedValues, SingleObservation observation, String errorMessage) {
this(code, content, timestampedContent, timestampedValues, observation, errorMessage, null);
}

public ObserveResponse(ResponseCode code, LwM2mNode content, List<TimestampedLwM2mNode> timestampedValues,
SingleObservation observation, String errorMessage, Object coapResponse) {
super(code, timestampedValues != null && !timestampedValues.isEmpty() ? timestampedValues.get(0).getNode()
: content, errorMessage, coapResponse);
public ObserveResponse(ResponseCode code, LwM2mNode content, TimestampedLwM2mNode timestampedContent,
List<TimestampedLwM2mNode> timestampedValues, SingleObservation observation, String errorMessage,
Object coapResponse) {
super(code, content, //
timestampedContent != null ? timestampedContent : //
timestampedValues != null && !timestampedValues.isEmpty() ? timestampedValues.get(0) : null,
errorMessage, coapResponse);

if (timestampedValues != null) {
if (content != null || timestampedContent != null) {
throw new IllegalArgumentException(
"Only one of 'content' OR 'timestampedContent' OR 'timestampedValues' should not be null");
}
this.timestampedValues = timestampedValues;
} else {
this.timestampedValues = null;
}

// CHANGED is out of spec but is supported for backward compatibility. (previous draft version)
if (ResponseCode.CHANGED.equals(code)) {
if (content == null)
if (getContent() == null)
throw new InvalidResponseException("Content is mandatory for successful response");
}

this.observation = observation;
this.timestampedValues = timestampedValues;
}

public List<TimestampedLwM2mNode> getTimestampedLwM2mNode() {
/**
* {@inheritDoc}
* <p>
* In case where client is using "Notification Storing When Disabled or Offline", the most recent value is returned.
* If you want the full historical timestamped values, you should use use {@link #getTimestampedLwM2mNodes()}.
*/
@Override
public LwM2mChildNode getContent() {
return super.getContent();
}

/**
* {@inheritDoc}
*
* <p>
* In case where client is using "Notification Storing When Disabled or Offline", the most recent value is returned.
* If you want the full historical timestamped values, you should use use {@link #getTimestampedLwM2mNodes()}.
*/
@Override
public TimestampedLwM2mNode getTimestampedLwM2mNode() {
return super.getTimestampedLwM2mNode();
}

/**
* A list of {@link LwM2mNode} representing different state of this resources at different instant. This method
* returns value only on notification when client are using "Notification Storing When Disabled or Offline" and
* content format support it.
*
* @return a list of {@link TimestampedLwM2mNode} OR <code>null</code> if this is a error response or "Notification
* Storing When Disabled or Offline" is not used.
*/
public List<TimestampedLwM2mNode> getTimestampedLwM2mNodes() {
return timestampedValues;
}

Expand Down Expand Up @@ -81,34 +124,38 @@ public SingleObservation getObservation() {
// Syntactic sugar static constructors :

public static ObserveResponse success(LwM2mNode content) {
return new ObserveResponse(ResponseCode.CONTENT, content, null, null, null);
return new ObserveResponse(ResponseCode.CONTENT, content, null, null, null, null);
}

public static ObserveResponse success(TimestampedLwM2mNode content) {
return new ObserveResponse(ResponseCode.CONTENT, null, content, null, null, null);
}

public static ObserveResponse success(List<TimestampedLwM2mNode> timestampedValues) {
return new ObserveResponse(ResponseCode.CONTENT, null, timestampedValues, null, null);
return new ObserveResponse(ResponseCode.CONTENT, null, null, timestampedValues, null, null);
}

public static ObserveResponse badRequest(String errorMessage) {
return new ObserveResponse(ResponseCode.BAD_REQUEST, null, null, null, errorMessage);
return new ObserveResponse(ResponseCode.BAD_REQUEST, null, null, null, null, errorMessage);
}

public static ObserveResponse notFound() {
return new ObserveResponse(ResponseCode.NOT_FOUND, null, null, null, null);
return new ObserveResponse(ResponseCode.NOT_FOUND, null, null, null, null, null);
}

public static ObserveResponse unauthorized() {
return new ObserveResponse(ResponseCode.UNAUTHORIZED, null, null, null, null);
return new ObserveResponse(ResponseCode.UNAUTHORIZED, null, null, null, null, null);
}

public static ObserveResponse methodNotAllowed() {
return new ObserveResponse(ResponseCode.METHOD_NOT_ALLOWED, null, null, null, null);
return new ObserveResponse(ResponseCode.METHOD_NOT_ALLOWED, null, null, null, null, null);
}

public static ObserveResponse notAcceptable() {
return new ObserveResponse(ResponseCode.NOT_ACCEPTABLE, null, null, null, null);
return new ObserveResponse(ResponseCode.NOT_ACCEPTABLE, null, null, null, null, null);
}

public static ObserveResponse internalServerError(String errorMessage) {
return new ObserveResponse(ResponseCode.INTERNAL_SERVER_ERROR, null, null, null, errorMessage);
return new ObserveResponse(ResponseCode.INTERNAL_SERVER_ERROR, null, null, null, null, errorMessage);
}
}
Loading