From 5bf2cd71dcd599b697c6a479e6453b02a656759f Mon Sep 17 00:00:00 2001 From: Simon Bernard Date: Fri, 8 Dec 2023 16:52:04 +0100 Subject: [PATCH] Fix code about resource instance deletion notification. --- .../CaliforniumServerEndpointsProvider.java | 2 +- .../endpoint/ServerCoapMessageTranslator.java | 45 ++++++++++--------- .../client/observe/ObserversManager.java | 34 ++++++++------ 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/endpoint/CaliforniumServerEndpointsProvider.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/endpoint/CaliforniumServerEndpointsProvider.java index 28425c3c3d..b559a903a6 100644 --- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/endpoint/CaliforniumServerEndpointsProvider.java +++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/endpoint/CaliforniumServerEndpointsProvider.java @@ -165,7 +165,7 @@ public void onNotification(Request coapRequest, Response coapResponse) { // create Observe Response try { - AbstractLwM2mResponse response = messagetranslator.createObservation(observation, + AbstractLwM2mResponse response = messagetranslator.createObserveResponse(observation, coapResponse, toolbox, profile); if (observation instanceof SingleObservation) { notificatonReceiver.onNotification((SingleObservation) observation, client, profile, diff --git a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/endpoint/ServerCoapMessageTranslator.java b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/endpoint/ServerCoapMessageTranslator.java index c96e539689..f40f695e8b 100644 --- a/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/endpoint/ServerCoapMessageTranslator.java +++ b/leshan-server-cf/src/main/java/org/eclipse/leshan/server/californium/endpoint/ServerCoapMessageTranslator.java @@ -21,7 +21,6 @@ import java.util.List; import java.util.Map; -import org.eclipse.californium.core.coap.CoAP; import org.eclipse.californium.core.coap.Request; import org.eclipse.californium.core.coap.Response; import org.eclipse.californium.core.server.resources.Resource; @@ -84,15 +83,8 @@ public List createResources(UplinkRequestReceiver receiver, ServerEndp identityHandlerProvider)); } - public AbstractLwM2mResponse createObservation(Observation observation, Response coapResponse, + public AbstractLwM2mResponse createObserveResponse(Observation observation, Response coapResponse, ServerEndpointToolbox toolbox, ClientProfile profile) { - // CHANGED response is supported for backward compatibility with old spec. - if (coapResponse.getCode() != CoAP.ResponseCode.CHANGED - && coapResponse.getCode() != CoAP.ResponseCode.CONTENT) { - throw new InvalidResponseException("Unexpected response code [%s] for %s", coapResponse.getCode(), - observation); - } - // get content format ContentFormat contentFormat = null; if (coapResponse.getOptions().hasContentFormat()) { @@ -107,25 +99,34 @@ public AbstractLwM2mResponse createObservation(Observation observation, Response if (observation instanceof SingleObservation) { SingleObservation singleObservation = (SingleObservation) observation; - List timestampedNodes = toolbox.getDecoder().decodeTimestampedData( - coapResponse.getPayload(), contentFormat, singleObservation.getPath(), profile.getModel()); - - // create lwm2m response - if (timestampedNodes.size() == 1 && !timestampedNodes.get(0).isTimestamped()) { - return new ObserveResponse(responseCode, timestampedNodes.get(0).getNode(), null, singleObservation, - null, coapResponse); - } else { - return new ObserveResponse(responseCode, null, timestampedNodes, singleObservation, null, + if (responseCode.isError()) { + return new ObserveResponse(responseCode, null, null, null, coapResponse.getPayloadString(), coapResponse); + } else { + List timestampedNodes = toolbox.getDecoder().decodeTimestampedData( + coapResponse.getPayload(), contentFormat, singleObservation.getPath(), profile.getModel()); + + // create lwm2m response + if (timestampedNodes.size() == 1 && !timestampedNodes.get(0).isTimestamped()) { + return new ObserveResponse(responseCode, timestampedNodes.get(0).getNode(), null, + singleObservation, null, coapResponse); + } else { + return new ObserveResponse(responseCode, null, timestampedNodes, singleObservation, null, + coapResponse); + } } } else if (observation instanceof CompositeObservation) { CompositeObservation compositeObservation = (CompositeObservation) observation; - Map nodes = toolbox.getDecoder().decodeNodes(coapResponse.getPayload(), - contentFormat, compositeObservation.getPaths(), profile.getModel()); - - return new ObserveCompositeResponse(responseCode, nodes, null, coapResponse, compositeObservation); + if (responseCode.isError()) { + return new ObserveCompositeResponse(responseCode, null, coapResponse.getPayloadString(), + coapResponse, null); + } else { + Map nodes = toolbox.getDecoder().decodeNodes(coapResponse.getPayload(), + contentFormat, compositeObservation.getPaths(), profile.getModel()); + return new ObserveCompositeResponse(responseCode, nodes, null, coapResponse, compositeObservation); + } } throw new IllegalStateException( diff --git a/leshan-tl-javacoap-client/src/main/java/org/eclipse/leshan/transport/javacoap/client/observe/ObserversManager.java b/leshan-tl-javacoap-client/src/main/java/org/eclipse/leshan/transport/javacoap/client/observe/ObserversManager.java index 491a874815..b45965e5d2 100644 --- a/leshan-tl-javacoap-client/src/main/java/org/eclipse/leshan/transport/javacoap/client/observe/ObserversManager.java +++ b/leshan-tl-javacoap-client/src/main/java/org/eclipse/leshan/transport/javacoap/client/observe/ObserversManager.java @@ -98,27 +98,35 @@ private void sendObservation(CoapRequest observeRequest, Service { - if (exception != null) { - observersStore.remove(observeRequest); - LOGGER.warn("[{}#{}] Removed observation relation, got exception: {}", peerAddress, - separateResponse.getToken(), exception.toString()); - } else if (!result) { + try { + notificationSender.apply(separateResponse).whenComplete((result, exception) -> { + if (exception != null) { + observersStore.remove(observeRequest); + LOGGER.warn("[{}#{}] Removed observation relation, got exception: {}", peerAddress, + separateResponse.getToken(), exception.toString()); + } else if (!result) { + observersStore.remove(observeRequest); + LOGGER.info("[{}#{}] Removed observation relation, got reset", peerAddress, + separateResponse.getToken()); + } + }); + + if (separateResponse.getCode() != Code.C205_CONTENT) { observersStore.remove(observeRequest); - LOGGER.info("[{}#{}] Removed observation relation, got reset", peerAddress, - separateResponse.getToken()); } - }); - - if (separateResponse.getCode() != Code.C205_CONTENT) { - observersStore.remove(observeRequest); + } catch (RuntimeException e) { + LOGGER.warn("Unexpected Exception when sending Notification(%s) to %s", peerAddress, + separateResponse.getToken(), e); } }