diff --git a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java index 3753262bca..39d67ecb9c 100644 --- a/application/src/main/java/org/thingsboard/server/controller/DeviceController.java +++ b/application/src/main/java/org/thingsboard/server/controller/DeviceController.java @@ -46,6 +46,7 @@ import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.controller.claim.data.ClaimRequest; import org.thingsboard.server.dao.device.claim.ClaimResponse; +import org.thingsboard.server.dao.device.claim.ClaimResult; import org.thingsboard.server.dao.exception.IncorrectParameterException; import org.thingsboard.server.dao.model.ModelConstants; import org.thingsboard.server.service.security.model.SecurityUser; @@ -406,19 +407,27 @@ public class DeviceController extends BaseController { device.getId(), device); String secretKey = getSecretKey(claimRequest); - ListenableFuture future = claimDevicesService.claimDevice(device, customerId, secretKey); - Futures.addCallback(future, new FutureCallback() { + ListenableFuture future = claimDevicesService.claimDevice(device, customerId, secretKey); + Futures.addCallback(future, new FutureCallback() { @Override - public void onSuccess(@Nullable ClaimResponse result) { + public void onSuccess(@Nullable ClaimResult result) { HttpStatus status; - if (result.equals(ClaimResponse.SUCCESS)) { - status = HttpStatus.OK; + if (result != null) { + if (result.getResponse().equals(ClaimResponse.SUCCESS)) { + status = HttpStatus.OK; + deferredResult.setResult(new ResponseEntity<>(result, status)); + } else { + status = HttpStatus.BAD_REQUEST; + if (result.getResponse().equals(ClaimResponse.FAILURE)) { + deferredResult.setResult(new ResponseEntity<>(result.getResponse(), status)); + } else { + deferredResult.setResult(new ResponseEntity<>(result, status)); + } + } } else { - status = HttpStatus.BAD_REQUEST; + deferredResult.setResult(new ResponseEntity<>(HttpStatus.BAD_REQUEST)); } - deferredResult.setResult(new ResponseEntity<>(result, status)); } - @Override public void onFailure(Throwable t) { deferredResult.setErrorResult(t); diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesService.java b/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesService.java index dad22a4a06..eb8c800d1e 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesService.java @@ -20,7 +20,7 @@ import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; -import org.thingsboard.server.dao.device.claim.ClaimResponse; +import org.thingsboard.server.dao.device.claim.ClaimResult; import java.util.List; @@ -28,7 +28,7 @@ public interface ClaimDevicesService { ListenableFuture registerClaimingInfo(TenantId tenantId, DeviceId deviceId, String secretKey, long durationMs); - ListenableFuture claimDevice(Device device, CustomerId customerId, String secretKey); + ListenableFuture claimDevice(Device device, CustomerId customerId, String secretKey); ListenableFuture> reClaimDevice(TenantId tenantId, Device device); diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesServiceImpl.java index 76a73c37d2..7f41490ca7 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/ClaimDevicesServiceImpl.java @@ -34,6 +34,7 @@ import org.thingsboard.server.common.data.kv.BooleanDataEntry; import org.thingsboard.server.dao.attributes.AttributesService; import org.thingsboard.server.dao.device.claim.ClaimData; import org.thingsboard.server.dao.device.claim.ClaimResponse; +import org.thingsboard.server.dao.device.claim.ClaimResult; import org.thingsboard.server.dao.model.ModelConstants; import java.util.Collections; @@ -95,7 +96,7 @@ public class ClaimDevicesServiceImpl implements ClaimDevicesService { } @Override - public ListenableFuture claimDevice(Device device, CustomerId customerId, String secretKey) { + public ListenableFuture claimDevice(Device device, CustomerId customerId, String secretKey) { List key = constructCacheKey(device.getId()); Cache cache = cacheManager.getCache(CLAIM_DEVICES_CACHE); ClaimData claimData = cache.get(key, ClaimData.class); @@ -104,18 +105,18 @@ public class ClaimDevicesServiceImpl implements ClaimDevicesService { if (currTs > claimData.getExpirationTime() || !secretKey.equals(claimData.getSecretKey())) { log.warn("The claiming timeout occurred or wrong 'secretKey' provided for the device [{}]", device.getName()); cache.evict(key); - return Futures.immediateFuture(ClaimResponse.FAILURE); + return Futures.immediateFuture(new ClaimResult(null, ClaimResponse.FAILURE)); } else { if (device.getCustomerId().getId().equals(ModelConstants.NULL_UUID)) { device.setCustomerId(customerId); - deviceService.saveDevice(device); - return Futures.transform(removeClaimingSavedData(cache, key, device), result -> ClaimResponse.SUCCESS); + Device savedDevice = deviceService.saveDevice(device); + return Futures.transform(removeClaimingSavedData(cache, key, device), result -> new ClaimResult(savedDevice, ClaimResponse.SUCCESS)); } - return Futures.transform(removeClaimingSavedData(cache, key, device), result -> ClaimResponse.CLAIMED); + return Futures.transform(removeClaimingSavedData(cache, key, device), result -> new ClaimResult(device, ClaimResponse.CLAIMED)); } } else { log.warn("Failed to find the device's claiming message![{}]", device.getName()); - return Futures.immediateFuture(ClaimResponse.CLAIMED); + return Futures.immediateFuture(new ClaimResult(device, ClaimResponse.CLAIMED)); } } diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/claim/ClaimResult.java b/dao/src/main/java/org/thingsboard/server/dao/device/claim/ClaimResult.java new file mode 100644 index 0000000000..ba740a1bcb --- /dev/null +++ b/dao/src/main/java/org/thingsboard/server/dao/device/claim/ClaimResult.java @@ -0,0 +1,30 @@ +/** + * Copyright © 2016-2019 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.dao.device.claim; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.thingsboard.server.common.data.Device; + +@AllArgsConstructor +@Data +public class ClaimResult { + + private Device device; + private ClaimResponse response; + +}