diff --git a/application/src/main/java/org/thingsboard/server/service/resource/DefaultTbResourceService.java b/application/src/main/java/org/thingsboard/server/service/resource/DefaultTbResourceService.java index 15ca6d7be3..2cde0e2113 100644 --- a/application/src/main/java/org/thingsboard/server/service/resource/DefaultTbResourceService.java +++ b/application/src/main/java/org/thingsboard/server/service/resource/DefaultTbResourceService.java @@ -89,7 +89,7 @@ public class DefaultTbResourceService implements TbResourceService { } catch (InvalidDDFFileException | IOException e) { throw new ThingsboardException(e, ThingsboardErrorCode.GENERAL); } - if (resource.getResourceType().equals(ResourceType.LWM2M_MODEL) && toLwM2mObject(resource) == null) { + if (resource.getResourceType().equals(ResourceType.LWM2M_MODEL) && toLwM2mObject(resource, true) == null) { throw new DataValidationException(String.format("Could not parse the XML of objectModel with name %s", resource.getSearchText())); } } else { @@ -131,7 +131,7 @@ public class DefaultTbResourceService implements TbResourceService { List resources = resourceService.findTenantResourcesByResourceTypeAndObjectIds(tenantId, ResourceType.LWM2M_MODEL, objectIds); return resources.stream() - .flatMap(s -> Stream.ofNullable(toLwM2mObject(s))) + .flatMap(s -> Stream.ofNullable(toLwM2mObject(s, false))) .sorted(getComparator(sortProperty, sortOrder)) .collect(Collectors.toList()); } @@ -142,7 +142,7 @@ public class DefaultTbResourceService implements TbResourceService { validateId(tenantId, INCORRECT_TENANT_ID + tenantId); PageData resourcePageData = resourceService.findTenantResourcesByResourceTypeAndPageLink(tenantId, ResourceType.LWM2M_MODEL, pageLink); return resourcePageData.getData().stream() - .flatMap(s -> Stream.ofNullable(toLwM2mObject(s))) + .flatMap(s -> Stream.ofNullable(toLwM2mObject(s, false))) .sorted(getComparator(sortProperty, sortOrder)) .collect(Collectors.toList()); } @@ -167,7 +167,7 @@ public class DefaultTbResourceService implements TbResourceService { return "DESC".equals(sortOrder) ? comparator.reversed() : comparator; } - private LwM2mObject toLwM2mObject(TbResource resource) { + private LwM2mObject toLwM2mObject(TbResource resource, boolean isSave) { try { DDFFileParser ddfFileParser = new DDFFileParser(new DefaultDDFFileValidator()); List objectModels = @@ -186,12 +186,16 @@ public class DefaultTbResourceService implements TbResourceService { instance.setId(0); List resources = new ArrayList<>(); obj.resources.forEach((k, v) -> { - if (v.operations.isReadable()) { + if (isSave) { + LwM2mResourceObserve lwM2MResourceObserve = new LwM2mResourceObserve(k, v.name, false, false, false); + resources.add(lwM2MResourceObserve); + } + else if (v.operations.isReadable()) { LwM2mResourceObserve lwM2MResourceObserve = new LwM2mResourceObserve(k, v.name, false, false, false); resources.add(lwM2MResourceObserve); } }); - if (resources.size() > 0) { + if (isSave || resources.size() > 0) { instance.setResources(resources.toArray(LwM2mResourceObserve[]::new)); lwM2mObject.setInstances(new LwM2mInstance[]{instance}); return lwM2mObject; diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportRequest.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportRequest.java index 425f1ee020..d2492ffa42 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportRequest.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportRequest.java @@ -147,11 +147,15 @@ public class LwM2mTransportRequest { } } else if (WRITE_UPDATE.name().equals(typeOper.name())) { - Lwm2mClientRpcRequest rpcRequestClone = (Lwm2mClientRpcRequest) rpcRequest.clone(); - if (rpcRequestClone != null) { + if (rpcRequest != null) { String errorMsg = String.format("Path %s params is not valid", targetIdVer); - serviceImpl.sentRpcRequest(rpcRequestClone, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR); - rpcRequest = null; + serviceImpl.sentRpcRequest(rpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR); + } + } + else if (WRITE_REPLACE.name().equals(typeOper.name()) || EXECUTE.name().equals(typeOper.name()) ) { + if (rpcRequest != null) { + String errorMsg = String.format("Path %s object model is absent", targetIdVer); + serviceImpl.sentRpcRequest(rpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR); } } else if (!OBSERVE_CANCEL.name().equals(typeOper.name())) { @@ -240,11 +244,13 @@ public class LwM2mTransportRequest { this.afterObserveCancel(registration, observeCancelCnt, observeCancelMsg, rpcRequest); break; case EXECUTE: - ResourceModel resourceModelExe = lwM2MClient.getResourceModel(targetIdVer, this.config.getModelProvider()); - if (params != null && !resourceModelExe.multiple) { - request = new ExecuteRequest(target, (String) this.converter.convertValue(params, resourceModelExe.type, ResourceModel.Type.STRING, resultIds)); - } else { - request = new ExecuteRequest(target); + ResourceModel resourceModelExecute = lwM2MClient.getResourceModel(targetIdVer, this.config.getModelProvider()); + if (resourceModelExecute != null) { + if (params != null && !resourceModelExecute.multiple) { + request = new ExecuteRequest(target, (String) this.converter.convertValue(params, resourceModelExecute.type, ResourceModel.Type.STRING, resultIds)); + } else { + request = new ExecuteRequest(target); + } } break; case WRITE_REPLACE: @@ -255,10 +261,12 @@ public class LwM2mTransportRequest { * JSON, TEXT; **/ ResourceModel resourceModelWrite = lwM2MClient.getResourceModel(targetIdVer, this.config.getModelProvider()); - contentFormat = getContentFormatByResourceModelType(resourceModelWrite, contentFormat); - request = this.getWriteRequestSingleResource(contentFormat, resultIds.getObjectId(), - resultIds.getObjectInstanceId(), resultIds.getResourceId(), params, resourceModelWrite.type, - registration, rpcRequest); + if (resourceModelWrite != null) { + contentFormat = getContentFormatByResourceModelType(resourceModelWrite, contentFormat); + request = this.getWriteRequestSingleResource(contentFormat, resultIds.getObjectId(), + resultIds.getObjectInstanceId(), resultIds.getResourceId(), params, resourceModelWrite.type, + registration, rpcRequest); + } break; case WRITE_UPDATE: if (resultIds.isResource()) { diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/Lwm2mClientRpcRequest.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/Lwm2mClientRpcRequest.java index 77a26b4755..248d4ee733 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/Lwm2mClientRpcRequest.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/Lwm2mClientRpcRequest.java @@ -109,14 +109,4 @@ public class Lwm2mClientRpcRequest { .setRequestId(this.requestId) .build(); } - - @Override - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - log.error("", e); - } - return null; - } }