lwm2m: add exception to ObserveCompositeCancel
This commit is contained in:
parent
221629fb29
commit
4fe63cee70
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -389,8 +389,49 @@ public class RpcLwm2MIntegrationObserveCompositeTest extends AbstractRpcLwM2MInt
|
|||||||
assertEquals("[\"SingleObservation:" + fromVersionedIdToObjectId(expectedIdVer3_0_9) + "\"]", actualValues);
|
assertEquals("[\"SingleObservation:" + fromVersionedIdToObjectId(expectedIdVer3_0_9) + "\"]", actualValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ObserveComposite {"ids":["/3", "/5/0/3", "/19/1/0/0"]} - Ok
|
||||||
|
* ObserveCompositeCancel {"ids":["/3/0/9", "/5/0/3", "/19/1/0/0"} -> BAD_REQUEST
|
||||||
|
* ObserveCompositeCancel {"ids":["/3"} -> CONTENT
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testObserveOneObjectAnyResources_Result_CONTENT_Cancel_OneResourceFromObjectAnyResource_Result_BAD_REQUEST_Cancel_OneObject_Result_CONTENT() throws Exception {
|
||||||
|
sendCancelObserveAllWithAwait(deviceId);
|
||||||
|
// ObserveComposite
|
||||||
|
sendCancelObserveAllWithAwait(deviceId);
|
||||||
|
String expectedIdVer5_0_3 = objectInstanceIdVer_5 + "/" + RESOURCE_ID_3;
|
||||||
|
String expectedIdVer19_1_0_0 = objectIdVer_19 + "/" + OBJECT_INSTANCE_ID_1 + "/" + RESOURCE_ID_0 + "/" + RESOURCE_INSTANCE_ID_0;
|
||||||
|
String expectedIds = "[\"" + objectIdVer_3 + "\", \"" + expectedIdVer5_0_3 + "\", \"" + expectedIdVer19_1_0_0 + "\"]";
|
||||||
|
String actualResult = sendCompositeRPCByIds("ObserveComposite", expectedIds);
|
||||||
|
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class);
|
||||||
|
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText());
|
||||||
|
|
||||||
|
// ObserveCompositeCancel
|
||||||
|
expectedIds = "[\"" + expectedIdVer19_1_0_0 + "\", \"" + idVer_3_0_9 + "\"]";
|
||||||
|
actualResult = sendCompositeRPCByIds("ObserveCompositeCancel", expectedIds);
|
||||||
|
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class);
|
||||||
|
assertEquals(ResponseCode.BAD_REQUEST.getName(), rpcActualResult.get("result").asText());
|
||||||
|
String expectedValue = "for observation path " + fromVersionedIdToObjectId(idVer_3_0_9) + ", that includes this observation path " + fromVersionedIdToObjectId(objectIdVer_3);
|
||||||
|
assertTrue(rpcActualResult.get("error").asText().contains(expectedValue));
|
||||||
|
|
||||||
|
// ObserveCompositeCancel
|
||||||
|
expectedIds = "[\"" + objectIdVer_3 + "\", \"" + expectedIdVer19_1_0_0 + "\"]";
|
||||||
|
actualResult = sendCompositeRPCByIds("ObserveCompositeCancel", expectedIds);
|
||||||
|
rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class);
|
||||||
|
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResult.get("result").asText());
|
||||||
|
assertEquals("2", rpcActualResult.get("value").asText());
|
||||||
|
|
||||||
|
String actualResultReadAll = sendCompositeRPCByKeys("ObserveReadAll", null);
|
||||||
|
ObjectNode rpcActualResultReadAll = JacksonUtil.fromString(actualResultReadAll, ObjectNode.class);
|
||||||
|
assertEquals(ResponseCode.CONTENT.getName(), rpcActualResultReadAll.get("result").asText());
|
||||||
|
String actualValues = rpcActualResultReadAll.get("value").asText();
|
||||||
|
assertEquals("[\"SingleObservation:" + fromVersionedIdToObjectId(expectedIdVer5_0_3) + "\"]", actualValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ObserveComposite {"ids":["/3/0/9", "/3/0/14", "/5/0/3", "/3/0/15", "/19/1/0/0"]} - Ok
|
* ObserveComposite {"ids":["/3/0/9", "/3/0/14", "/5/0/3", "/3/0/15", "/19/1/0/0"]} - Ok
|
||||||
|
* ObserveCancel {"id":"/3/0/9"} -> INTERNAL_SERVER_ERROR
|
||||||
* ObserveCompositeCancel {"ids":["/3/0/9", "/19/1/0/0", "/3]} - Ok
|
* ObserveCompositeCancel {"ids":["/3/0/9", "/19/1/0/0", "/3]} - Ok
|
||||||
* last Observation
|
* last Observation
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -311,7 +311,8 @@ public class RpcLwm2mIntegrationObserveTest extends AbstractRpcLwM2MIntegrationO
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Observe {"id":"/3"}
|
* Observe {"id":"/3"}
|
||||||
* ObserveCancel {"id":"/3/0/9"}
|
* ObserveCancel {"id":"/3/0/9"} -> INTERNAL_SERVER_ERROR
|
||||||
|
* ObserveCancel {"id":"/3"} -> CONTENT
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testObserveObject_ObserveCancelOneResource_Result_INTERNAL_SERVER_ERROR_Than_Cancel_ObserveObject_Result_CONTENT_Count_1() throws Exception {
|
public void testObserveObject_ObserveCancelOneResource_Result_INTERNAL_SERVER_ERROR_Than_Cancel_ObserveObject_Result_CONTENT_Count_1() throws Exception {
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -69,6 +69,8 @@ import org.eclipse.leshan.server.model.LwM2mModelProvider;
|
|||||||
import org.eclipse.leshan.server.registration.Registration;
|
import org.eclipse.leshan.server.registration.Registration;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.common.data.device.profile.lwm2m.ObjectAttributes;
|
import org.thingsboard.server.common.data.device.profile.lwm2m.ObjectAttributes;
|
||||||
|
import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
|
||||||
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
|
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
|
||||||
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
|
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext;
|
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext;
|
||||||
@ -244,6 +246,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendCancelObserveCompositeRequest(LwM2mClient client, TbLwM2MCancelObserveCompositeRequest request, DownlinkRequestCallback<TbLwM2MCancelObserveCompositeRequest, Integer> callback) {
|
public void sendCancelObserveCompositeRequest(LwM2mClient client, TbLwM2MCancelObserveCompositeRequest request, DownlinkRequestCallback<TbLwM2MCancelObserveCompositeRequest, Integer> callback) {
|
||||||
|
try {
|
||||||
Set<Observation> observations = context.getServer().getObservationService().getObservations(client.getRegistration());
|
Set<Observation> observations = context.getServer().getObservationService().getObservations(client.getRegistration());
|
||||||
List<LwM2mPath> listPath = LwM2mPath.getLwM2mPathList(Arrays.asList(request.getObjectIds()));
|
List<LwM2mPath> listPath = LwM2mPath.getLwM2mPathList(Arrays.asList(request.getObjectIds()));
|
||||||
Optional<Observation> observationOpt = Optional.ofNullable(observations.stream().filter(observation -> observation instanceof CompositeObservation && ((CompositeObservation) observation).getPaths().equals(listPath)).findFirst().orElse(null));
|
Optional<Observation> observationOpt = Optional.ofNullable(observations.stream().filter(observation -> observation instanceof CompositeObservation && ((CompositeObservation) observation).getPaths().equals(listPath)).findFirst().orElse(null));
|
||||||
@ -253,19 +256,33 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
|
|||||||
callback.onSuccess(request, cnt);
|
callback.onSuccess(request, cnt);
|
||||||
} else {
|
} else {
|
||||||
Set<String> lwPaths = new HashSet<>();
|
Set<String> lwPaths = new HashSet<>();
|
||||||
observations.forEach(obs -> {
|
for (Observation obs : observations) {
|
||||||
LwM2mPath lwPathObs = ((SingleObservation) obs).getPath();
|
LwM2mPath lwPathObs = ((SingleObservation) obs).getPath();
|
||||||
listPath.forEach(nodePath -> {
|
for (LwM2mPath nodePath : listPath) {
|
||||||
if(nodePath.equals(lwPathObs) || lwPathObs.startWith(nodePath)){ // nodePath = "3", lwPathObs = "3/0/9": cancel for tne all lwPathObs
|
String validNodePath = validatePathCompositeCancel(nodePath, lwPathObs, client);
|
||||||
lwPaths.add(nodePath.toString());
|
if (validNodePath != null) lwPaths.add(validNodePath);
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
});
|
|
||||||
for (String nodePath : lwPaths) {
|
for (String nodePath : lwPaths) {
|
||||||
cnt += context.getServer().getObservationService().cancelObservations(client.getRegistration(), nodePath);
|
cnt += context.getServer().getObservationService().cancelObservations(client.getRegistration(), nodePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
callback.onSuccess(request, cnt);
|
callback.onSuccess(request, cnt);
|
||||||
|
} catch (ThingsboardException e){
|
||||||
|
callback.onValidationError(request.toString(), e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String validatePathCompositeCancel(LwM2mPath nodePath, LwM2mPath lwPathObs, LwM2mClient client) throws ThingsboardException {
|
||||||
|
if (nodePath.equals(lwPathObs) || lwPathObs.startWith(nodePath)) { // nodePath = "3", lwPathObs = "3/0/9": cancel for tne all lwPathObs
|
||||||
|
return nodePath.toString();
|
||||||
|
} else if (!nodePath.equals(lwPathObs) && nodePath.startWith(lwPathObs)) {
|
||||||
|
String errorMsg = String.format(
|
||||||
|
"Unexpected error: There is registration with Endpoint %s for observation path %s, that includes this observation path %s",
|
||||||
|
client.getRegistration().getEndpoint(), nodePath, lwPathObs);
|
||||||
|
throw new ThingsboardException(errorMsg, ThingsboardErrorCode.BAD_REQUEST_PARAMS);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright © 2016-2023 The Thingsboard Authors
|
* Copyright © 2016-2024 The Thingsboard Authors
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user